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条件?
答案 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);
}
在执行之前,所有变量都在使用前声明。基于此,foo
将undefined
和不在函数外声明的全局值。因此,当您致电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
对全局变量没有影响。