x = 1;
alert(x);
var y = function() {
alert(x);
var x = 2;
alert(x);
}
y();
3 个警报的结果是:1
, undefined
, 2
(Chrome 25)
我的问题是:为什么第二个警报未定义?为什么不是1?不是有一个全局变量 x 吗?
x = 1;
alert(x);
var y = function() {
alert(x);
var x = 2;
alert(x);
}
y();
3 个警报的结果是:1
, undefined
, 2
(Chrome 25)
我的问题是:为什么第二个警报未定义?为什么不是1?不是有一个全局变量 x 吗?
由于提升,这是被执行的:
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
但未初始化。
函数中的变量声明被提升到顶部。所以它在技术上看起来像这样:
var y = function() {
var x;
alert(x);
x = 2;
};
局部变量盖过了全局变量。这就是警报返回的原因undefined
。
由于 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”。因此,当您在函数中声明某个变量时,我建议您在函数顶部声明变量。