【发布时间】:2014-01-31 17:00:31
【问题描述】:
一切都始于这些简单的代码行:
a = 3;
b = 2;
function line(x) {
var a = 5;
var b = 4;
return a*x+b;
}
// returns 17
b = line(a) - b;
alert(b);
// returns 36
c = line(a) + b;
alert(c);
两个警报分别返回 17 和 36。
控件按预期工作。直到……
我改错了
函数内部是这样的:
function line(x) {
var a = 5;
b = 4;
return a*x+b;
}
突然第 13 行返回 15,第 17 行返回 23
随着我关注var,情况继续恶化
在兔子洞里,随着我的下降而变得更加陷入困境。
我意识到我可以记下始终使用var
并且知道我的代码将始终按预期工作
但这已经成为一个原则问题,现在我需要
了解var 的实际工作原理。
这里是四地狱的链接,
由(并且可能为)我制作:
谜语#1 http://jsfiddle.net/js_test/gNEmY/
谜语#2 http://jsfiddle.net/js_test/FJVYL/
谜语#3 http://jsfiddle.net/js_test/Vz7Sd/
谜语#4 http://jsfiddle.net/js_test/RaA5J/
如果有人能给我见解
了解幕后发生的事情
也就是说,在每次 alert() 调用期间会发生什么;
我真的很感激。
【问题讨论】:
-
谢谢@Bergi 我明白了。我更想了解其中一个谜语中发生了什么。
-
变量 Declaration Binding Instantiation 在 ECMA-262 中描述。 VariableEnvironment 可以被认为是一个不可访问的对象,其属性是局部变量。
标签: javascript variables closures scope