javascript共有三种作用域 :全局作用域,局部作用域,eval作用域。
eval作用域可以这么使用eval() 、window.eval()。
javascript没有块作用域,即
var foo=1;
if(true){
var foo=2;
for (var i = 3; i <=5; i++){
var foo=i;
console.log(foo);
}
}
console.log(foo);//输出3,4,5,5;覆盖了全局变量
var foo=10000;
var slm={
name:"slm",
age:24,
sex:"male",
showage:function(){
if(true){
var foo=100;
for (var i = 3; i <=5; i++){
var foo=i;
console.log(foo);
}
console.log(foo);
}
console.log(foo);
}()
}
slm.showage;
console.log(foo);输出3,4,5,5,5,10000;局部的值都覆盖了,全局变量没覆盖
作用域链和原型链的区别并不大,都是通过位置体系和分层体系进行变量查找。当作用域链内最近位置查到变量,查找就结束,返回第一个匹配结果。
函数定义时确定作用域,而非调用时确定。作用域链是根据函数定义时的位置确定的,而不是在调用时确定的。作用域链是在调用函数之前创建,因此可以创建闭包。可以让函数全局作用域返回一个嵌套函数,但该函数仍可以通过作用域链访问其父函数作用链。