我正在关注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?
这实际上会输出i o g
。
我希望看到i undefined g
。
以下是我对该过程的理解。我想了解我的错误:
inner
被声明为全局对象的属性,值设置为undefined
outer
被调用。outer
的{{1}}和全局对象创建执行上下文。outerVar
属性的值分配了对函数定义的引用。inner
的执行上下文完成。 (相关的范围被删除?标记为GC?)outer
被调用。inner
和全局对象。innerVar
醇>
有人可以解释一下定义outerVar
的原因吗?
答案 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
...链