举例
//预处理阶段 a.b为undefined,c报错,加载的是f,d不存在,报错
alert(a);
alert(b);
alert(c);
alert(d);
var a =1
if(false){
var b = 2;
}else{
c = 3;
}
function f(){
var d = 4
}
一、定义:确定一个变量、成员、函数被访问的范围
二、块作用域,块指{}里的成员只有自己能访问,js没有块作用域
块{}
for(var i =0; i<3; i++){
}
alert(i) //3
三、函数作用域,
function f(){
var x
function g(){
}
}
四、动态作用域,,在运行时生成,js没有动态作用域
function f(){
alert(x)
}
function f1(){
var x =5;
f();
}
function f1(){
var x =6;
f();
}
f1();//报错
五、静态作用域(词法作用域或闭包)
a.js的作用域解析
b.
创建f的时候,生成隐藏成员scope,为词法环境,即f [[scope]] == lexicalEnv == window
执行的时候,创建自己的词法环境 lexicalEnv -> f.[[scope]]==window
var x = 100;
function f(){
alert(x);
}
function f1(){
var x =5;
f();
}
function f2(){
var x =6;
f()
}
f1();//输出11
作用域的继承
function f(){ //scope == window
//le{x = 100} -> f.[[scope]]
var x = 100;
function g(){ g.[[scope]] = f.le
//le ->g.[[scope]]
}
g();
}
g.le->g.[[scope]]->f.le->f.[[scope]] == window
六、创建函数的方式
function f(){}
var f = function(){}
var f = function x(argument){}
var f = new Function("","alert()")
七、new function创建函数的作用域
function f(){ //scope = window
var x = 100;
var g =function(){ //g.scope = f.le
alert(x)
}
g()
}
f(); //100
function f(){
var x = 100;
var g = new Function("","alert(x)") //g.[[]scope] = window
g()
}
f(); //报错,除非在外面加var x = 100
八、作用域的本质
当在一个函数要找到一个变量中,先在本身的词法环境找,找不到,往上一层寻找,直到window对象
http://www.cnblogs.com/liu666/p/5747667.html