“没有用var声明的为全局变量”这种说法不准确

 

结论:

“没有用var声明的变量为全局变量”这样的说法不太正确,需要在这句话前面加一个前提,如果①变量前面没有用var声明,②在变量所在在的作用域链中没有这个变量名称,则设置该变量为全局变量。

代码

var n = 0;
function foo(){
  var n = 1;
  return function bar(){   
    n = 2;
  }
}
foo();
console.log(n);//0

这个例子中作用域链为bar--->foo---->window

n=2沿着作用域链找到foo作用域中n(原来等于1),然后将foo作用域中的n改为2,不够全局作用域中n=0没有变化

如果把代码改成下面这样

var n = 0;
function foo(){
   n = 1;
  return function(){   
   var n = 2;
  }
}
foo();
console.log(n);//1

  

原文地址:https://www.cnblogs.com/xuhaodong/p/6102831.html