javascript变量作用域链

+展开
-JavaScript
var a = 10;
  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. 预编译干的事可以理解为将一些作用域链保存入栈,在运行阶段才开始去执行函数。
来源:http://hi.baidu.com/zhoumm1008/blog/item/c10414e267336f39b8382083.html

加支付宝好友偷能量挖...


评论(0)网络
阅读(75)喜欢(0)操作系统及应用软件