【问题标题】:JavaScript while loop accepts condition before var declaration [duplicate]JavaScript while循环在var声明之前接受条件[重复]
【发布时间】:2018-04-16 04:23:15
【问题描述】:

我很惊讶以下代码可以正常工作:

while(fred !== "stop"){
    var fred = prompt("Should I stop or go?")
};

我会在 do while 循环中理解这一点:

do {
    code to be executed at least once
​}
while (condition);

JavaScript 如何在函数声明 fred 为变量之前设置条件?

我读过的其他问题与条件语句内部的 var 声明有关。

【问题讨论】:

  • 为此必须有几十个欺骗目标。还没找到。
  • 只需在prompt 语句之前放置一个console.log(fred),您会注意到null 在您的prompt 被处理之前被打印了无数次。 那说fred已经被提升了,因为它有函数范围。
  • @T.J.克劳德——我也这么认为。 'Hoisted' JavaScript Variables 问题将 var 声明放在顶部 - 这很有意义,除非您希望提示出现在循环内。
  • @Sharpasamarble:再看一遍。 var x 位于函数的中间,它(和提升)是问题的核心(答案回答了这个问题)。
  • @T.J.克劳德 - 足够公平。 'Hoisted' JavaScript Variables 提供了一个更完整的答案,因为它演示了一个忽略在其上方声明的变量 x 并提升自己的函数的函数。

标签: javascript while-loop var


【解决方案1】:

在声明fred之前,fred是undefined,所以undefined !== "stop",这是真的。

【讨论】:

  • 它在技术上不是未声明的,javascript 会将 var 声明“提升”到最近的函数范围的顶部,因此它已声明,只是尚未设置任何内容
  • @beeglebug: "undefined" != 未声明
  • 它被提升了,是的,但它仍然是未定义的,所以即使它从未被分配一个正确的值,条件也会为真。
  • 那么为什么要投反对票?!
【解决方案2】:

使用var 声明变量时,JavaScript 有点奇怪;它们是在函数范围内声明的,而不是像其他语言一样在块范围内声明。如果你的函数中有一个 var ,任何地方,最后声明被拉到开头(不是实例化);所以你的代码变成:

function () {
    var fred;
    while(fred !== "stop"){
        fred = prompt("Should I stop or go?")
    };
}

刚声明时,变量存在并接收undefined 的值。如果您想要更明智的块范围变量,请使用let/const。然后你会得到你期望的行为。

【讨论】:

    【解决方案3】:

    来自Mozilla documentation:

    变量声明,无论它们出现在哪里,都会在执行任何代码之前进行处理。

    和

    因为变量声明(以及一般的声明)是在任何代码执行之前处理的,所以在代码的任何地方声明一个变量就相当于在顶部声明它。这也意味着一个变量在它被声明之前可以被使用。这种行为称为“提升”,因为变量声明似乎被移到函数或全局代码的顶部。

    还有一个警告:

    重要的是要指出,提升会影响变量声明,但不会影响其值的初始化。当到达赋值语句时,该值确实会被赋值:

    【讨论】:

      猜你喜欢
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2015-06-02
      • 2019-01-17
      • 1970-01-01
      相关资源
      最近更新 更多