前些天看到了关于JS作用域的文章,结合自己之前了解的一些,在这里做了一个小小的总结。
作用域也就是变量能够在声明它的函数体以及这个函数体所嵌套函数体中都是被定义的。
举个简单的例子
function scope(){
var f=“foo“;
if(2<3){
var a="1";
console.log("f:"+f);//foo
}
while(1){
var b="22";
console.log("f:"+f);//foo
}
!function(){
var c="333";
console.log("f:"+f);//foo
}
console.log(
f;//foo
a;//1
b;// 22
c;//c is not undefined
);
}
根据这个例子可以看出,在scope体内定义的变量f可以在函数体内及内部嵌套的函数体、语句块中访问,所以f作用域就是scope函数体。
在js中,没有块级作用域,只有函数作用域。注意:如果一个变量没有使用var声明,这个变量便是全局变量,它的作用域便属于window对象。
作用域链:一个函数体嵌套了多层函数体,在每层函数体内定义了同一变量,当其中一个函数访问这个变量时,就会形成一条作用域链。
eg.f="window";
function one(){
var f="one";
function two(){
var f="two";
console.log(f);
}
function three(){
console.log(f);
}
two();//twothree();//one
}
one();
上面的函数当我们执行two时,会形成如下的作用域链:two—>one—>window,此时,js引擎沿着作用域链找到two中对应的f为”two“;
执行three时,作用域链是three—>one—>window,因此找到了”one“。