JavaScript深入浅出-作用域

全局.函数,eval

1
2
3
4
5
6
7
8
9
10
11
var a=10;//全局作用域
(function(){
var b=20;
})();
console.log(a);//10
console.log(b);//error, b is not defined
for(var item in {a:1,b:2}){
console.log(item)
}
console.log(item)// item still in scope
eval('var a=1; ');

JavaScript无块级作用域,只有函数作用域.
如 匿名立即执行作用域

作用域链

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function outer2(){
var local2=1;
function outer1(){
var local=1;
}
outer1();
}
var global3=1;
outer2();
function outer(){
var i=1;
var func=new Function('console.log(typeof i)');
func();//undefined
}
outer()

在outer1函数中可以访问到 outer2,global
用new Function去构造一个函数 实际上这个函数的作用域是全局作用域而非当前函数的作用域

利用函数作用域封装

1
2
3
4
5
6
7
8
(function(){
//do sth
var a,b;
})();
!function(){
// do sth
var a,b;
}