我一直在阅读有关JavaScript吊装的消息。
JavaScript Scoping and Hoisting by Ben Cherry
Two words about “hoisting” by Dmitry Soshnikov
并且,更多关于JavaScript类型强制,真相&假测试: Truth, Equality and JavaScript和其他一些资源
在练习一些时,发现我遗漏了一些关于吊装的重要概念和一个变量'truthy& falsy。
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
(在下面的no-tricks代码中显示:代码段#3),则情况并非如此
var foo = 1;
function bar() {
if (!foo) {
alert('inside if');
}
}
bar();
o / p:没有输出;表示控制未输入'if'block
这是人们所期待的
var foo = 1;
function bar() {
if (false) {
alert('inside if');
var foo = 10;
}
}
bar();
o / p:没有输出;表示控制未输入'if'block
这是人们所期待的
有人请澄清。感谢
答案 0 :(得分:8)
对于您的示例编号1,将显示警报,因为您在函数内部使用var
并且var
声明被提升到函数的顶部,因此它等效于:< / p>
var foo = 1;
function bar() {
var foo;
if (!foo) {
alert('inside if');
foo = 10;
}
}
bar();
有人可能会得出结论,这些问题提供了令人信服的理由,可以在函数顶部明确声明所有变量。
答案 1 :(得分:1)
仅热切评估变量声明。第一种情况(在if
块中)的变量赋值仅在进入if
块时发生。
您仅声明但未指定任何值的变量的值为undefined
(强制为false
)。