全局变量:在函数以外用var声明的变量在全局都可以使用,就是全局 变量.
*如果页面不关闭,那么就不会释放,就会占内存,消耗内存
局部变量:在函数内部定义的变量是局部变量,只能在函数内部使用,外部不能使用
*当函数调用完毕,局部变量就释放了
全局作用域:全局变量使用的范围
局部作用域 :局部变量的使用范围
隐式全局变量:变量声明没有var,就叫隐式全局变量
function f1(){ number = 100;//是隐式全局变量 } f1(); console.log(number);//此时打印的结果是100 *注意:全部变量是不能被删除的,但是隐式全局变量是能被删除的 var num1 = 1; num2 = 2; delete num1; delete num2; console.log(num1);//number console.log(num1+2);//3 console.log(num2);//undefined
作用域链
var num = 10; function f1(){ var num = 20; function f2(){ var num = 30; function f3(){ var num = 40; console.log(num); } f3(); } f2(); } f1();//结果为40 **如果f3中没有num就会到f2中去寻找num,找到后打印f2中的值,如果没有到f1中寻找num,如果有打印f1的num值,如果没有再到全局中寻找num,找到打印num的值,如果在找不到,就报错
预解析
在解析代码之前,把变量的声明和函数的声明提前到当前所在的作用域的最上面
f1(); function f1(){ console.log("函数的预解析"); }
上面的代码把函数提前声明了,所以f1调用的时候不会报错
案例1: f1(); function f1(){ console.log(num); var num = 10; } 上面的代码相当于: function f1(){ var num;//undefined,因为只定义了还没赋值就调用了,所以结果是undefined,如果没有预解析,就会报错 console.log(num); num = 10; } f1();
案例2: f1();//此函数调用的结果是undefined var num = 20; function f1(){ console.log(num); var num = 10; } //上面函数代码就相当于 var num = 20; function f1(){ var num ; console.log(num);//在函数内部找到num后就不会出函数再去找 num = 10; }
案例3: var a; a = 18; f1(); function f1(){ var b = 9; console.log(a);//udefined console.log(b);//9 var a = '123'; }
案例4: f1(); console.log(c);//9 console.log(b);//9 console.log(a);//报错 function f1(){ var a = b = c = 9; console.log(c);//9 console.log(b);//9 console.log(a);//9 } //以上代码就相当于: function f1(){ var a; a = 9; //局部变量 b = 9; //隐式全局变量 c = 9; //隐式全局变量 console.log(c);//9 console.log(b);//9 console.log(a);//9 } f1(); console.log(c);//9 console.log(b);//9 console.log(a);//报错
函数声明预解析:
f1(); //报错 var f1 = function (){ console.log(a); var a = 10; } 解释:因为在调用的时候只声明了一个变量,并没有说明是不是一个函数,直接函数调用就报错了。 var f1; f1(); f1 = function(){ var a ; console.log(a); a = 10; }