【问题标题】:Very weird behavior when using "var" keyword in an ajax request在 ajax 请求中使用“var”关键字时非常奇怪的行为
【发布时间】:2015-08-30 08:41:51
【问题描述】:

我已经为此担心了一段时间,但我无法意识到真正发生了什么。代码 cmets 中的解释。一个应用程序有 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

【问题讨论】:

  • 我不觉得这是一个完全重复的问题,因为这是及时提出的问题,我对吊装没有任何想法。这更像是一个问“它是什么”的问题,而不是“它的行为方式”。投票重新开放

标签: javascript ajax variables var


【解决方案1】:

酷,你发现了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

【讨论】:

  • 哇,我刚刚学到了非常有趣的东西!我敢打赌我会记住这一点,谢谢
  • 只是另一个问题,这是否意味着任何从未执行过的行(在函数内部)都会破坏整个代码?根据您的上次编辑,它让我认为它仅在执行功能之前“提升”。我说的对吗?
  • @Martin。绝对地。 var ten = 10; (function() { if(false) { var ten = false; } alert(ten); /* alerts undefined, at first glance, you'd expect it to alert 10 */ }());
  • 该死,这是我在 JS 中看到的最奇怪的行为
  • 感谢所有帮助过我的人,非常抱歉我不能接受所有的答案。再次为 SO 社区加油!
【解决方案2】:

正如其他人所说,它正在提升。但是为了让您更清楚地了解正在发生的事情,第一个代码实际上是这样执行的:

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
});

【讨论】:

  • 好吧,我想我不太清楚为什么会发生这种情况。它遍历代码,初始化变量“id”而不填充任何值(因此从第一行清除值)并在第一个警报后将其值填充为“test2”?
  • @Martin。就像你说的那样。
【解决方案3】:

这叫吊装。 var id 移动到函数顶部。

【讨论】:

  • 不填值?
  • @Martin - 正确。它在任何其他代码语句之前声明变量,因此它不是未定义的,然后在原始代码行中为其分配值。
猜你喜欢
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 2016-03-13
  • 2011-03-01
  • 1970-01-01
  • 2017-07-28
相关资源
最近更新 更多