6
x = 1; 
alert(x); 
var y = function() { 
    alert(x); 
    var x = 2; 
    alert(x); 
} 
y(); 

3 个警报的结果是:1, undefined, 2(Chrome 25)

我的问题是:为什么第二个警报未定义?为什么不是1?不是有一个全局变量 x 吗?

4

3 回答 3

13

由于提升,这是被执行的:

x = 1; 
alert(x); 
var y = function() { 
    var x; // <-- this gets hoisted up from where it was.

    alert(x); 
    x = 2; 
    alert(x); 
} 
y();

在 function 开始时y(),声明了局部变量x但未初始化。

于 2013-04-02T13:22:23.747 回答
1

函数中的变量声明被提升到顶部。所以它在技术上看起来像这样:

var y = function() {
    var x;

    alert(x);

    x = 2;
};

局部变量盖过了全局变量。这就是警报返回的原因undefined

于 2013-04-02T13:22:49.513 回答
0

由于 JavaScript 中的作用域是一个函数对象。当您在函数中执行某些代码(您的代码示例)时,“alert(x)”将查找函数中是否存在“x”的任何定义。所以,这个函数中有一个“var x = 2”。但是 JavaScript 运行时会这样解释你的代码:

x = 1; 
alert(x); 
var y = function() { 
  var x;
  alert(x); 
  x = 2; 
  alert(x); 
} 
y(); 

因此,第二个警报中的 x 是“未定义”而不是“1”。因此,当您在函数中声明某个变量时,我建议您在函数顶部声明变量。

于 2013-04-02T14:17:31.703 回答