【问题标题】:Javascript: Why if statement does not evaluate the hoisted variable in function [duplicate]Javascript:为什么if语句不评估函数中的提升变量[重复]
【发布时间】:2016-10-15 14:20:14
【问题描述】:

AFAIK,变量声明在定义它们的上下文中被提升,但是在下面的代码中,taken from here

var foo = 1;
function bar() {
    if (!foo) {
        var foo = 10;
    }
    alert(foo);
}
bar();

if(!foo) 计算结果为 true 但为什么呢?我的意思是 var foo 在 foo 的上下文中评估 if(!foo) 之前已经存在于该语句中var foo = 10 因此 if(!foo) 应该解析为 if(!true),进一步解析为 if(false) 这意味着不应执行 if 块但 @ 987654331@ 评估为真,因此 if 块中的代码被执行并警告 10

谁能告诉我为什么以及如何评估 if 条件?

【问题讨论】:

  • 你把我弄糊涂了
  • 从快速浏览链接的文章中,那里得到了解释..

标签: javascript javascript-objects


【解决方案1】:

欢迎来到Javascript "Hoisting",做一些看起来不像正在做的想法很烦人:)

那么,发生了什么事 Javascript 没有 if 子句的块范围,它以一种奇怪的方式弥补了这一点。我的意思是,当你这样做时

function bar() {
    if (!foo) {
        var foo = 10;
    }
    alert(foo);
}

其实是翻译成:

function bar() {
    var foo;
    if (!foo) {
      foo = 10;
    }
    alert(foo);
}

在被执行之前,让所有的变量在使用之前都被声明。基于此,foo 将是 undefined不是在函数外部声明的全局值。因此,当您调用if (!foo) 时,它将评估!undefined,始终为true

【讨论】:

  • 请注意,变量和函数声明都被提升到 ES5 中给定范围的顶部。因此,我更喜欢遵循 ​​Crockford 的建议,即在范围顶部编写所有函数和 var 声明,以便编写的内容类似于正在发生的事情。这是一个约定,而不是规则,但我发现它简化了代码的阅读。
  • @anied 完全正确!并感谢引用 Crockford 的建议 :)
【解决方案2】:

这个会给你1;

function bar() {
    var foo =1;
    if (!foo) {
        var foo = 10;
    }
    alert(foo);
}
bar();

因为函数中声明的变量 foo 没有出来;) 这也会给你1:

var foo = 1;
function bar(x) {
    if (!x) {
        var x = 10;
    }
    alert(foo);
}
bar(foo);

【讨论】:

    【解决方案3】:

    编译 foo 函数时,还有另一个 foo 变量的声明。由于函数中变量的提升,变量foo会被赋值为undefined,直到代码执行完毕。

    if 语句正在检查 foo 是否为 falsey,因为当时变量为 undefined,它是 falsey 所以进入 if将值 10 分配给 foo 的语句。

    由于作用域,在内部函数中更改foo 对全局变量没有影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      相关资源
      最近更新 更多