js中变量名提升和函数名提升

时间:2021-07-10 00:45:06

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