这是我遇到的一个令人困惑的行为,我无法弄明白:
var foo = 'outside';
function logIt(){
console.log(foo);
var foo = 'inside';
}
logIt();
这将产生 undefined 。这对我来说已经无法解释了。但更奇怪的是:
var foo = 'outside';
function logIt(){
console.log(foo);
}
logIt();
实际上会产生 在之外。
为什么会这样?
答案 0 :(得分:5)
因为变量声明(和一般的声明)是 在执行任何代码之前处理,在任何地方声明变量 在代码中相当于在顶部声明它。
因此,您的代码相当于:
var foo = 'outside';
function logIt(){
var foo;
console.log(foo);
foo = 'inside';
}
logIt();
在致电console.log
时,foo undefined
。
答案 1 :(得分:2)
这与在Javascript中提升变量有关。
var foo = 'outside';
function logIt(){
console.log(foo);
var foo = 'inside';
}
logIt();
将在内部成为:
var foo = 'outside';
function logIt(){
var foo;
console.log(foo);
foo = 'inside';
}
logIt();
因此,foo将在console.log中为undefined
: - )
答案 2 :(得分:0)
您希望在javascript上 hoisting
当你这样写:
var foo = 'outside';
function logIt(){
console.log(foo);
var foo = 'inside';
}
logIt();
javascript将解释如下代码:
var foo = 'outside';
function logIt(){
var foo; //undefined
console.log(foo);
foo = 'inside';
}
logIt();
foo
内的logIt()
在undefined
之前被声明为console.log(foo)
,这就是为什么它未定义。
在第二个示例中,console.log(foo)
在您声明全局var foo = 'outside'
后运行,这就是它打印outside
的原因。
答案 3 :(得分:0)
正如其他人正确提到的,这是因为吊装。
对许多开发人员来说,吊装是一种未知或被忽视的JavaScript行为。 如果开发人员不理解提升,程序可能包含错误(错误)。 为了避免错误,请始终在每个范围的开头声明所有变量。
所以在你的例子中它应该是这样的:
function logIt(){
foo = 'inside';
console.log(foo);
}
logIt();
预期结果。