【问题标题】:Why is this function yielding 'undefined'?为什么这个函数会产生“未定义”?
【发布时间】:2017-02-26 12:09:34
【问题描述】:
这是我遇到的一个非常令人困惑的行为,我无法弄清楚:
var foo = 'outside';
function logIt(){
console.log(foo);
var foo = 'inside';
}
logIt();
这将产生 undefined。这对我来说已经无法解释了。但更奇怪的是:
var foo = 'outside';
function logIt(){
console.log(foo);
}
logIt();
实际上会产生外部。
为什么会这样?
【问题讨论】:
标签:
javascript
function
scope
var
【解决方案1】:
Variable hoisting
因为变量声明(以及一般的声明)是
在执行任何代码之前处理,在任何地方声明一个变量
在代码中相当于在顶部声明。
因此您的代码相当于:
var foo = 'outside';
function logIt(){
var foo;
console.log(foo);
foo = 'inside';
}
logIt();
在调用console.log 时,foo 是 undefined。
【解决方案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 :-)
【解决方案3】:
您正在寻找 hoisting 在 javascript 上
当你写这个时:
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();
logIt() 中的foo 在console.log(foo) 之前声明为undefined,这就是它未定义的原因。
在第二个示例中,console.log(foo) 在您声明全局 var foo = 'outside' 之后运行,这就是它打印 outside 的原因。
【解决方案4】:
正如其他人正确提到的,这是因为吊装。
提升(对于许多开发人员而言)是 JavaScript 的一种未知或被忽视的行为。
如果开发人员不了解提升,程序可能包含错误(错误)。
为避免错误,请始终在每个作用域的开头声明所有变量。
所以在你的例子中应该是这样的:
function logIt(){
foo = 'inside';
console.log(foo);
}
logIt();
为了预期的结果。