在ajax请求中使用“var”关键字时非常奇怪的行为

时间:2015-06-14 22:30:40

标签: javascript ajax variables var

我一直担心这件事,我无法意识到真正发生了什么。代码注释中的说明。应用程序有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

3 个答案:

答案 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被移到函数的顶部。