我遇到了一个非常奇怪的(对我来说)var
关键字问题。我已将它缩减为一个相当小的测试用例,并发现它在 Node.js(因此是 V8 和 Chrome)、Safari 4 的检查器(因此是 Nitro)和 FireBug(显然是 SpiderMonkey)中都有展示。我最初是在准备一份错误报告,但由于它的展示如此广泛,我将假设我完全误解了 JavaScript 应该如何界定和查找变量。
测试用例非常小,在 GitHub 上:http: //gist.github.com/260067。第一个示例和第二个示例之间的唯一区别是包含var
关键字。
这里也是一个类似的测试用例,它以不同的方式展示了相同的“问题”:https ://gist.github.com/698b977ee0de2f0ee54a
编辑:为了排除任何试图解释级联作用域如何工作的答案,我对此非常熟悉。我的问题是我不明白为什么以下代码“有效”(因为它alert()
是“外部”,然后是“内部”,然后是“外部”):
(function(){
var foo = 'outer';
alert("Outer `foo`: " + foo);
(function(){
foo = 'inner';
alert("Inner `foo`: " + foo);
var foo;
})();
alert("Outer `foo`: " + foo);
})();
var foo;
发生在与重新分配完全无关的位置foo
;那么为什么它会以非常重要的方式影响这项任务呢?