首先,js中变量没有块级作用域,但是有函数作用域,即只有函数可以约数变量的作用域。
并且,函数的实质也是一个变量,所以可以改变它的值,即赋值。所以变量名提升和函数名提升非常相像。
1.变量名的提升发生在函数内部。看下面的例子。说明:第一个因为弹出undefined,相当于在上面定义了var num;因为函数内部,定义了var num=20;就相当于在一开始定义了var num;这就是变量名的提升。
???var num = 10; ???function func() { ???????alert(num); //undefined ???????var num = 20; ???????alert(num); //20 ???} ???func(); ???alert(num) //10
相当于:
var num = 10; ???function func() { ???????var num; ???????alert(num); //undefined ???????var num = 20; ???????alert(num); //20 ???} ???func(); ???alert(num) //10
如果没有var
var num = 10; ???function func() { ???????alert(num); //10 ???????num = 20; ???????alert(num); //20 ???} ???func(); ???alert(num) //20
函数嵌套道理一样
var num = 10; ???????function func() { ???????????alert(num); //undefined ???????????num = 20; ???????????function func1() { ???????????????alert(num); //undefined ???????????????var num = 40; ???????????????alert(num) //30 ???????????} ???????????func1() ???????????alert(num); //20 ???????} ???????func(); ???????alert(num) //10
2.函数名提升发生在lambda函数上,即匿名函数。和变量名提升一个道理。
???????var func = function () { ???????????alert("abc") ???????}; ???????function func1() { ???????????func(); //func is not a function ???????????var func = function () { ???????????????alert("123") ???????????}; ???????????func() ???????} ???????func1();
省去var
?var func = function () { ???????????alert("abc") ???????}; ???????function func1() { ???????????func(); //abc ???????????func = function () { ???????????????alert("123") ???????????}; ???????????func()//123 ???????} ???????func1();
改变函数,不使用匿名函数
???????var func = function () { ???????????alert("abc") ???????}; ???????function func1() { ???????????func(); //123 ???????????function func() { ???????????????alert("123") ???????????}; ???????????func()//123 ???????} ???????func1();
js中变量名提升和函数名提升
原文地址:http://www.cnblogs.com/greatfish/p/7528603.html