我对var
关键字遇到了一个很奇怪的问题(对我来说)。我将它缩减为一个相当小的测试用例,并发现它在Node.js(因此,V8和Chrome),Safari 4的检查器(因此,Nitro)和FireBug(显然,SpiderMonkey)中都有展示。我原本准备一份错误报告,但由于它的显示如此广泛,我将假设我完全误解了JavaScript应该如何确定范围并查找变量。JavaScript`var`关键字的混淆操作
测试用例很小,在GitHub上:http://gist.github.com/260067。第一个和第二个示例的唯一区别是包含var
关键字。
这里,以及,是指具有以不同的方式相同的“问题”进行类似的测试案例:https://gist.github.com/698b977ee0de2f0ee54a
编辑:排除任何更多的答案试图解释级联范围是如何工作的,我对此非常熟悉。我的问题是,我不明白为什么下面的代码“作品”(因为它alert()
S“外,”其次是“内部”,然后再“外”):
(function(){
var foo = 'outer';
alert("Outer `foo`: " + foo);
(function(){
foo = 'inner';
alert("Inner `foo`: " + foo);
var foo;
})();
alert("Outer `foo`: " + foo);
})();
的var foo;
发生在与foo
重新分配完全无关的位置;那为什么它会以非常实质的方式影响这项任务?
为什么使用eval?绝对没有理由在您发布的代码中使用eval。 – Marius 2009-12-19 13:38:38
为了演示这个问题。实际执行是非常不同的;你可以在这里看到它:http://github.com/elliottcable/poopy.js/blob/new-acquire/lib/from.js#L193 – ELLIOTTCABLE 2009-12-19 13:39:21
你的最后一个例子是因为1)foo ='inner';将该值赋给父函数foo,该函数可以访问它。 2)你不需要使用var来声明一个变量。 – Marius 2009-12-19 14:04:34