javascript 作用域链分析
+展开
-JavaScript
var a = 10;
function test() {
a = 100;
alert(a);
alert(this.a);
var a;
alert(a);
}
test();
function test() {
a = 100;
alert(a);
alert(this.a);
var a;
alert(a);
}
test();
对于上述代码中test函数的作用域链的形成过程:
step:1
[[scope]] = {
{
a: undefine,
test: undefined,
document: ...,
location: ...,
}
}
step2:
[[scope]] = {
{
a: 10,
test: undefined,
document: ...,
location: ...,
}
}
step43:
[[scope]] = {
{
a: 100,
},
{
a: 10,
test: undefined,
document: ...,
location: ...,
}
}
[[scope]] = {
{
a: undefined,
},
{
a: 10,
test: undefined,
document: ...,
location: ...,
}
}
2. 先对全局进行语法分析,将var 变量及 function建立作用域链,分别对应varDecls和funcDecls,同时对应funcDecls还会创建函数对象,将varDecls加入到 funcDecls的scope中。再对全局执行(如此时有赋值操作即会执行);再根据调用情况建立调用对象,将全局对象的作用域链加入到调用对象的作用域中,对函数内部的变量或者内部函数定义进行语法分析,语法分析完成后再进行函数的执行,如此进行循环。这样便组成作用域链,从内层到外层。一定要记住先语法分析(定义),再执行(执行的过程中就直接查找已经行成的作用域链,如若变量定义在alert后,则先将输入undefined),先外后内。
3. 预编译干的事可以理解为将一些作用域链保存入栈,在运行阶段才开始去执行函数。
加支付宝好友偷能量挖...