2015-10-14 34 views
7

在下面为什么x在内部范围内未定义?

var x = 1; 

(function() { 
    console.log(x); 
    var x = 2; 
}()); 

代码为什么说CONSOLE.LOG(X)时,x是未定义的?

+0

@WolfOfWallstreet所以你想在你console.log(x);获得2号的权利? –

回答

9

变量提升。实际的代码是这样执行的。

var x = 1; 
(function() { 
    var x; // x = undefined 
    console.log(x); 
    x = 2; 
})(); 

编辑:关于李斯特先生的建议,有点关于变量提升。来自MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var):

“变量声明,无论它们出现在哪里,都会在任何代码执行之前被处理。var声明的变量的作用域是当前的执行上下文,它可能是包含函数或变量在任何职能之外宣布,全球。“

+2

你可以向OP解释什么变量提升是什么,为什么'var x = 1;函数whatever(){console.log(x);}'工作吗? –

+0

我知道他们可以在其他地方查看它,但如果这里的答案是独立的,那么它会很好。 –

+0

@ TBWill4321这个代码当我做它。它给未定义! –

3

由于编译器的原因,即使您在代码下面启动了一个var,编译器也会将它发送到顶端,就像var x;,因此它在运行console.log之前首先启动为未定义的“x”,这就是为什么这是一种很好的练习,可以启动你将要在函数中使用的所有变量,所以这些错误不会发生。