关于javascript:为什么x在内部范围内是未定义的?

Why is x undefined in inner scope?

本问题已经有最佳答案,请猛点这里访问。

在下面的代码中

1
2
3
4
5
6
var x = 1;

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

为什么当console.log(x),x未定义?


可变起重。实际代码是这样执行的。

1
2
3
4
5
6
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声明的变量的范围是其当前执行上下文,该上下文是封闭函数,或者对于在任何函数外部声明的变量,是全局的。"


由于编译器的原因,即使您在代码下面初始化一个var,编译器也会将它发送到顶部,就像var x;一样,所以在运行console.log之前,它首先初始化为未定义的"x",这就是为什么在函数中使用第一个变量是初始化所有var的良好实践,因此不会发生这些错误。