在下面的代码中
var x = 1;
(function () {
console.log(x);
var x = 2;
}());
为什么当console.log(x),x未定义时?
答案 0 :(得分: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声明的变量的范围是它的当前执行上下文,它是封闭函数,或者对于在任何函数外部声明的变量,是全局的。"
答案 1 :(得分:3)
由于编译器,即使你在代码下面启动var,编译器也会将它发送到顶部,就像var x;
一样,所以它首先启动为未定义的" x"在运行console.log之前,为什么这是一个很好的做法来启动所有vars你将在函数中使用第一个东西,所以这些错误不会发生。