我一直担心这件事,我无法意识到真正发生了什么。代码注释中的说明。应用程序有2个版本,其中一个抛出奇怪的结果,第二个执行预期的工作。
var id = "test1";
$.post("http://fiddle.jshell.net/echo/json/", {"data": "data"}, function(a) {
alert(id); // will throw undefined
var id = "test2";
alert(id); // will throw "test2" as expected
});
$.post("http://fiddle.jshell.net/echo/json/", {"data": "data"}, function(a) {
alert(id); // will throw "test1" as expected
id = "test2";
alert(id); // will throw "test2" as expected
});
我不确定它是否与ajax调用或匿名函数有关,但这只是我发现它的方式所以我最好保留它。有人可以解释我错过了什么吗?当我省略var
关键字时,为什么它的行为会有所不同?你可以试试here on jsFiddle
答案 0 :(得分:8)
很酷,你发现了hoisting
。 MDN解释说它和任何人一样好:
因为变量声明(和一般的声明)是 在执行任何代码之前处理,在任何地方声明变量 在代码中相当于在顶部声明它。这也意味着 变量在声明之前似乎可以使用。这个 行为被称为"吊装",因为看起来变量 声明被移动到函数或全局代码的顶部。
以下MDN链接的代码示例:
bla = 2
var bla;
// ...
// is implicitly understood as:
var bla;
bla = 2;
你可以看到这将导致"奇怪的行为":
alert(testId);
var testId = 2;
相当于:
var testId;
alert(testId);
testId = 2;
这让我了解了我可以传授的最后一点知识,总是在你的代码块的顶部声明你的变量,所以这"奇怪的行为"被编入您的程序(并且永远不会再次抛弃):
function someFunction() {
var
firstVar,
secondVar,
thirdVar;
//rest of your code statements here
}
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting
答案 1 :(得分:4)
正如其他人所说,它正在提升。但只是这样你可以更清楚地了解发生了什么,第一个代码实际上是这样执行的:
var id = "test1";
$.post("http://fiddle.jshell.net/echo/json/", {"data": "data"}, function(a) {
// this is because of hoisting
var id = undefined;
alert(id); // will throw undefined
id = "test2";
alert(id); // will throw "test2" as expected
});
答案 2 :(得分:3)
它被称为吊装。 var id
被移到函数的顶部。