JavaScript 11

作用域

任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。

全局作用域(Global Scope)

在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:

(1)在最外层函数外面定义的变量拥有全局作用域

var authorName="山边小溪";

function doSomething(){

var blogName="梦想天空";

function innerSay(){

alert(blogName);

}

innerSay();

}

alert(authorName);

alert(blogName);

doSomething();

innerSay() ;

(2)所有末定义直接赋值的变量自动声明为拥有全局作用域,

function doSomething(){

var authorName="山边小溪";

blogName="梦想天空";

alert(authorName);

}

doSomething();

alert(blogName);

alert(authorName);

变量blogName拥有全局作用域,而authorName在函数外部无法访问到

(3)所有window对象的属性拥有全局作用域

一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。

局部作用域(Local Scope)

和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域,例如下列代码中的blogName和函数innerSay都只拥有局部作用域

function doSomething(){

var blogName="梦想天空";

function innerSay(){

alert(blogName);

}

innerSay();

}

alert(blogName); //脚本错误

innerSay(); //脚本错误

作用域链(Scope Chain)

由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是window对象的属性,所以这些对象的关系可以看作是一条链 ,链头就是变量所处的对象,链尾就是window对象

var n=1;

function show(){

var n=2;

alert(n);

}

show();

当函数show执行的时候,首先在函数show内部查找变量n,没有找到,再向外层查找,找到了全局变量n,alert显示结果为1。

原理就是JavaScript作用域是层层包含的,外层的作用域在内层有效,执行的时候,从内层向外层查找

局部变量优先级高于全局变量

var n=1;

function show(){

var m=2;

var n=3;

alert(n);  //显示结果为3

}

show();

根据上面变量作用域链的原理,函数执行时,会先从内层向外层查找,如果在内层中找到变量,查找就会停止。所以内层的作用域会优先于外层,局部优先于全局。

var n=1;

function show(){

var m=2;

var n=3;

alert(window.n);  //显示结果为1

}

show();

为什么会是1,而不是3呢,只是另外一个问题:全局变量都是window对象的属性,任何的全局变量都是window对象的属性,都可以用window.*来引用。(*代表一个变量)

函数内部的var声明的变量作用域

在函数内部使用var声明的变量,不论在何处声明,该变量都拥有整个函数的作用域。

var n=1;

function show(){

alert(n);  //undefined

alert(this.n); //显示为1

var n=3;  //声明局部变量n

alert(n);  //显示为3

}

show();

第一个问什么会显示undefined呢,这个问题的原因就是在函数后面声明了局部变量n=3,在函数show执行的时候,会先从内层查找变量n,结果找到了,但在第一个alert的时候,n还没有赋值,故结果为undefined。

每天的沉淀都是为了有更好的明天,上天不会辜负每个努力的人,只要你坚持下去,相信自己,为自己加油!!!

你可能感兴趣的:(JavaScript 11)