函数运行过程中,变量的查找是由内向外逐层查找,直到window域
如没有找到则返回undefined,或者is not defined
如果是赋值操作,在没有找到的情况下,会在window域下面生成一个变量,并为之赋值,这样这个变量就会变成全局变量
添加和不添加var声明变量的比较
console.log(window.d);
conosle.log(window.e);
前两个变量d 和 e 在window 这个域里面没有这样的变量,所以返回undefined undefined
function fun(){ d = 5; var e = 6; } fun()
通过运行fun函数, window 域下面的一个变量d被赋值,e就变成了一个函数内部的局部变量
conosle.log(window.d); // 5
console.log(window.e); //undefined
console.log(e); // e is not defined
不加var 的变量通过赋值不会全部变成全局变量的
例如:
function fun1(){ var a; function fun2 (){ a = 6 var b = 7 c = 8 } fun2() } fun1() console.log(window.c) //8 console.log(c) //8 console.log(a) // a is not defined 错误 console.log(b) //如上面打印的变量a的语句不注释,这此语句不会被执行,因为JS执行特性为从上向下执行,报错后,后面的代码将不会被执行
fun2函数内部给变量a赋值为6但变量a是一个函数内部的局部变量,在全局调用的就会找不到这个变量而报错(a is not defined),声明了一个局部变量 b 值为7,在全局调用b也会找不到这个变量报错(b is not defined),变量c 在函数内部没有找到声明的局部变量,就会一直向上层搜索,一直到window,如没有找到已经声明的变量,就会在window域下面声明一个变量,并给这个变量赋值
如没有赋值操作,调用c 和 window.c的区别
var a = 1 function fun() { console.log(a); // 1 console.log(window.b); // undefined console.log(b); // b is not defined , 单独调用,则作为属性来查找,没有就会返回is not defined } fun();