为什么这个函数产生 'undefined'?

Why is this function yielding 'undefined'?

这是我遇到的一个非常令人困惑的行为,我无法弄清楚:

var foo = 'outside';

function logIt(){

   console.log(foo); 
   var foo = 'inside';

} 

logIt();

这将产生 undefined。这对我来说已经无法解释了。但奇怪的是,这个 :

var foo = 'outside';

function logIt(){

   console.log(foo); 

} 

logIt();

实际上会产生 外部

为什么会这样?

Variable hoisting

Because variable declarations (and declarations in general) are processed before any code is executed, declaring a variable anywhere in the code is equivalent to declaring it at the top.

因此您的代码等同于:

var foo = 'outside';

function logIt(){
   var foo;
   console.log(foo); 
   foo = 'inside';
} 

logIt();

并且在调用 console.log 时,foo undefined.

这与 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 :-)

您正在 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()里面的fooconsole.log(foo)之前被声明为undefined,这就是它未定义的原因。

在第二个示例中,console.log(foo) 在您声明全局 var foo = 'outside' 之后运行,这就是它打印 outside.

的原因

正如其他人正确提到的那样,这是因为吊装。

提升是(对许多开发人员而言)JavaScript 的未知或被忽视的行为。 如果开发人员不了解提升,程序可能会包含错误(错误)。 为避免错误,请始终在每个作用域的开头声明所有变量。

所以在你的例子中它应该是这样的:

function logIt(){ foo = 'inside'; console.log(foo); }

logIt();

预期结果。