变量的生命周期
变量的作用范围
静态作用域(词法定义域)
由程序定义的位置决定
var x=10;
function foo(){alert(x);}
function bar(){var x=20;foo();}
bar();//10
动态作用域
由程序运行时刻决定,使用动态栈管理。
JS使用静态作用域
JS没有块级作用域,有全局作用域和函数作用域
ES5中使用词法环境管理作用域
词法环境包括:
1、环境记录
形参
函数声明
变量
……
2、对外部环境的引用outer
环境记录初始化—声明提前(函数形参,函数声明,变量)
var x=10;
function foo(y){
var z=30;
function bar(q){
return x+y+z+q;
}
return bar;
}
var bar=foo(20);
bar(40);
函数开始执行前,进行函数解析。
全局环境:(函数声明,函数定义前置到最顶部,变量前置,未赋值。)
环境记录:foo:
x: undefined
bar:undefined
outer:null
全局环境解析完后,开始执行,x赋值为10,bar赋值,需要执行foo函数,进行foo函数的函数解析:
foo函数环境变量:
环境记录:y:20(形参)
bar:
z:undefined
outer:全局环境
foo函数解析完成后,执行foo函数,z赋值为30,执行到return,return的是bar函数,执行bar函数,实际执行的是foo函数里面的bar函数。进行bar函数的解析:
bar函数环境变量
环境记录:q:40(形参)
outer:foo函数环境变量
执行bar函数,顺着outer环境去寻找变量
词法环境—with
var foo ="abc";
with({foo:"bar"}){
function f(){
alert(foo);
};
(function(){alert(foo);
})();
f();
}
词法环境 try…catch