浅谈变量提升与函数提升

变量提升

简单的说,就是将变量提升到它本身所在作用域的最开始的部分。

1
2
3
4
5
console.log(a);    //undefined

var a = "string";

console.log(a); //string

之所以出现这种情况,是因为 js 的变量提升,上面的例子等同于:

1
2
3
4
5
6
7
var a;

console.log(a); //此时只是声明了变量,并没有进行赋值操作

a = "string";

console.log(a);

函数提升

创建函数有两种方式:分别是函数声明和函数字面量式。其中,只有函数声明才有函数提升。

1
2
3
4
5
6
7
console.log(func1);    // function func1(){}

console.log(func2); //undefined

function func1() {}

var f = function func2(){}

这种情况就是函数提升造成的,相当于下面这样:

1
2
3
4
5
6
7
function func1(){}

console.log(func1);

console.log(func2);

var f = function func2(){]

现在举一个稍微复杂一点的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var a = 1;

function b() {

console.log(a);

a = 10;

console.log(a); //10

var a = 11;

console.log(a); //11

return;

function a(){

alert("abc");

}

}

b(); //

console.log(a); //1

再同一个变量名的情况下,函数提升的优先级是高于变量提升的。上面的例子等同于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function b(){

function a(){

alert("abc");

}

console.log(a);

a = 10;

console.log(a);

a = 11;

console.log(a);

return ;

}

var a;

a = 1;

b();

console.log(a);
作者

晓策

发布于

2017-08-18

更新于

2022-06-09

许可协议

评论