“没有用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