6

我一直在阅读有关 JavaScript 提升的文章。

JavaScript 范围界定和提升,作者 Ben Cherry
关于“提升”的两个词,作者:Dmitry Soshnikov

还有更多关于 JavaScript 类型强制、真假测试的信息: Truth、Equality 和 JavaScript以及其他一些资源

在练习一些时,发现我错过了一些关于提升和变量“真假”的重要概念。

1:带有重复变量声明的“if”真值测试

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

} 
bar();

o/p:inside if

怀疑: 'foo' 值为 '1',if(!foo)应该评估为false并且该块不应该被执行(引用上面的资源:提升只影响var&function声明,但不影响执行)。但是为什么会显示该警报。如果我直接使用,情况并非如此false(如下面的无技巧代码所示:片段#3)

2:没有重复变量声明的“if”真值测试

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

} 
bar();

o/p:无输出;表示控制未进入“if”块
这是人们可以期待的

3: 'if' 使用 'false' 重复变量声明

var foo = 1; 
function bar() { 
    if (false) { 
        alert('inside if');
        var foo = 10; 
    } 
} 
bar();

o/p:无输出;表示控制未进入“if”块
这是人们可以期待的

有人请澄清。谢谢

4

2 回答 2

9

对于您的示例编号 1,显示警报是因为您在var函数内部使用并且var声明被提升到函数的顶部,因此它相当于:


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

} 
bar();

人们可能会得出这样的结论:这些类型的问题提供了在函数顶部显式声明所有变量的令人信服的理由。

于 2011-07-20T17:43:28.240 回答
1

只有变量声明被热切评估。第一种情况(在if块中)的变量分配仅在进入if块时发生。

您仅声明但未为其分配任何值的变量具有undefined(强制为false)的值。

于 2011-07-20T17:42:49.333 回答