【发布时间】:2014-04-26 19:43:02
【问题描述】:
我正在关注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创建一个执行上下文,其作用域链包括outerVar和全局对象。 - 为全局对象上的
inner属性值分配了对函数定义的引用。 -
outer的执行上下文完成。 (相关范围被删除?标记为 GC?) -
inner被调用。 - 创建了一个执行上下文,其作用域链包括
innerVar和全局对象。 -
范围内找不到
outerVar
谁能解释一下为什么定义outerVar?
【问题讨论】:
-
你刚刚发现了闭包! How do JavaScript closures work?
-
该评论可能比必要的更讨人喜欢,@Bergi。我认为这是一个关于调用和声明之间的一些我不理解的细微差别的问题,而不是需要一个总体概述。我正在阅读一些不同的概述,都一样:)
标签: javascript scope executioncontext