首先,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();