由于全局范围变量导致javascript错误

时间:2012-11-02 10:13:59

标签: javascript

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

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

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

3 个答案:

答案 0 :(得分:5)

  

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

不,它应该打印before undefined,因为var从函数的开头起生效,无论你在哪里写它。

您的代码完全与此相同:

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

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

当然,变量以值undefined开头。

详细信息:Poor misunderstood var

答案 1 :(得分:4)

解析代码时,JavaScript解析器会Variable Hoisting。这意味着任何变量声明都将移动到当前作用域的顶部,因此在您的情况下,此代码将被执行:

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

因此,您的本地变量x首先被声明,初始值为undefined

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

答案 2 :(得分: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 ;
})();