首先,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();
时间: 2024-10-14 10:36:04