Javascript:为什么if语句不评估函数中的提升变量

时间:2016-10-15 14:20:14

标签: javascript javascript-objects

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

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

if(!foo)评估为true,但为什么?我的意思是var foo已经存在var foo = 10之前{f}的上下文if(!foo)评估if(!foo)因此if(!true)应该解析为if(false),进一步解析为if (!foo)这意味着不应该执行if块,而是$('.last-chance').css('margin-top', position - 200 + "px");  评估为true,因此执行if块中的代码并发出警告10

任何人都可以告诉我为什么以及重要的是如何评估if条件?

3 个答案:

答案 0 :(得分:3)

欢迎来到Javascript "Hoisting"并且这种令人讨厌的能力让人觉得看起来不像是在做什么:)

所以,Javascript没有if子句的块范围,并且它以一种奇怪的方式补偿了它。我的意思是,当你做的时候

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

实际上翻译为:

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

在执行之前,所有变量都在使用前声明。基于此,fooundefined在函数外声明的全局值。因此,当您致电if (!foo)时,它会评估!undefined,始终为true

答案 1 :(得分:0)

这个会给你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);

答案 2 :(得分:0)

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

if语句正在检查foo是否 falsey ,因为该变量为undefined,因为它是 falsey 所以进入if语句,其中值10被分配给foo

由于范围的原因,更改内部函数中的foo对全局变量没有影响。