3
var x = 3;
(function (){
  console.log('before', x);
  var x = 7;
  console.log('after', x);
  return ;
})();

在上面的代码中,var X 被全局初始化。因此,在函数内部,第一个 console.log 应该打印“3 之前”,但我不明白。原因是我试图重新声明全局变量。

有人可以解释为什么会这样吗?

4

3 回答 3

5

在上面的代码中,var X 被全局初始化。所以在函数内部,第一个 console.log 应该打印“before 3”。

不,它应该 print before undefined,因为var无论您在哪里编写它,它都会从函数的开头生效。

您的代码与此完全相同

var x = 3;
(function (){
 var x;

 console.log('before', x);
 x = 7;
 console.log('after', x);
 return ;
})();

当然,变量以 value 开头undefined

详情:差错误会var

于 2012-11-02T10:15:07.970 回答
4

JavaScript 解析器在解析代码时会执行变量提升。这意味着任何变量声明都将移至当前范围的顶部,因此在您的情况下,将执行以下代码:

var x = 3;
(function (){
  var x;
  console.log('before', x);
  x = 7;
  console.log('after', x);
  return ;
})();

所以你的局部变量x首先被声明为初始值为undefined.

这应该解释为什么你会得到一个“beforeundefined”作为第一个console.log()

于 2012-11-02T10:16:37.043 回答
1

变量的作用域比其他语言简单得多。它不是从声明开始,而是:

  • 你有声明的函数
  • 如果声明不在函数中,则为全局范围

MDN

用 var 声明的变量的范围是封闭函数,或者对于在函数外部声明的变量,全局范围(绑定到全局对象)。

您可以想象所有变量声明都移到了作用域(函数)的开头。所以这就像

var x = 3;
(function (){
  var x;
  console.log('before', x); // now undefined
  x = 7;
  console.log('after', x); // now 7
  return ;
})();

请注意了解确切的范围(函数,而不是块):

var x = 3;
(function (){
  console.log('before', x); // this is undefined !
  if (true) {
      var x = 7;
  }
  return ;
})();
于 2012-11-02T10:16:02.813 回答