嵌套执行上下文的生命周期

时间:2014-04-26 19:43:02

标签: javascript scope executioncontext

我正在关注article on javascript closures

在试图了解执行环境的细节时,我发现了让我感到惊讶的结果。

var globalVar = 'g';
var inner;
var outer = function() {
  var outerVar = 'o';
  inner = function() {
    var innerVar = 'i';
    console.log(innerVar, outerVar, globalVar);
  }
}

outer()
inner() // Q: What does this log out?

http://jsfiddle.net/6zvsh/

这实际上会输出i o g

我希望看到i undefined g

以下是我对该过程的理解。我想了解我的错误:

  1. inner被声明为全局对象的属性,值设置为undefined
  2. outer被调用。
  3. 为范围链包含outer的{​​{1}}和全局对象创建执行上下文。
  4. 为全局对象的outerVar属性的值分配了对函数定义的引用。
  5. inner的执行上下文完成。 (相关的范围被删除?标记为GC?)
  6. outer被调用。
  7. 创建执行上下文,其范围链包括inner和全局对象。
  8. 在范围中找不到
  9. innerVar

    有人可以解释一下定义outerVar的原因吗?

1 个答案:

答案 0 :(得分:1)

创建函数时,它会将其周围的执行上下文作为范围引用,为其创建closure

让我们一步一步:

  

1。 inner被声明为全局对象的属性,值设置为undefined

1.5。创建outer函数,将全局范围引用为其父范围

  

2。 <{1}}被调用。

     

3。为outer创建执行上下文,其范围 chain 包括outer和全局对象。

...因为新执行上下文的链接引用了outerVar的父作用域,它是(在1.5中赋值)全局作用域。 outer是此新执行上下文中的变量。

  

4。全局对象上的outerVar属性的值被赋予对函数定义的引用。

...并且函数的父作用域设置为inner的执行上下文。

  

5。 outer的执行上下文完成。 (相关范围被删除?标记为GC?)

...但不是垃圾收集,因为它仍被引用为仍然存在的outer函数的父作用域(不是垃圾)。

  

6。 <{1}}被调用。

     

7。创建执行上下文,其范围 chain 包括inner和全局对象。

新的执行上下文具有指向inner父上下文的作用域链,该上下文是为innerVar调用(具有到全局作用域的链链接)创建的执行上下文。 inner是此新执行上下文中的变量。

  

8。在范围

中找到outer

...链