为什么这个功能会产生“未定义的”#?

时间:2016-10-17 13:22:11

标签: javascript function scope var

这是我遇到的一个令人困惑的行为,我无法弄明白:

var foo = 'outside';

function logIt(){

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

} 

logIt();

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

var foo = 'outside';

function logIt(){

   console.log(foo); 

} 

logIt();

实际上会产生 之外

为什么会这样?

4 个答案:

答案 0 :(得分:5)

Variable hoisting

  

因为变量声明(和一般的声明)是   在执行任何代码之前处理,在任何地方声明变量   在代码中相当于在顶部声明它。

因此,您的代码相当于:

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();

预期结果。