一、 Var 变量声明提升

在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量

var 有函数作用域 但是没有块级作用域

使用var声明的变量存在变量提升的情况,使用var声明的变量,在定义语句之前就可以被访问到,而且值为undefined

注意:顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象

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
30
31
32
var a = 1
console.log(window.a) // 1


console.log(a) // undefined
var a = 2
在编译阶段,编译器会将其变成以下执行

var a
console.log(a)
a = 2
使用var,我们能够对一个变量进行多次声明,后面声明的变量会覆盖前面的变量声明

var a = 2
var a = 3
console.log(a) // 30
在函数中使用使用var声明变量时候,该变量是局部的

var a = 2
function change(){
var a = 3
}
change()
console.log(a) // 2
而如果在函数内不使用var,该变量是全局的

var a = 2
function change(){
a = 3
}
change()
console.log(a) // 3

二、函数声明提升

通过function声明的函数,在其声明的地方之前就能够进行调用
!!!注意:函数表达式 不会提升 因为等号是赋值 不是声明

1
2
3
4
5
6
//function 声明
function a() {
console.log(1);
}
//函数表达式
a = function () { console.log(3); }

三、函数声明提升与变量声明提升综合

!!! 函数声明提升的优先级比变量声明提升优先级更高,放在最前面,因此会被变量赋值所覆盖。

四、题目实战

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
一、
var a = 5;
// 变量提升
function fn (){
console.log('a :', a);
var a = 7;
}
fn()
// a : undefined
// 函数内部进行了变量的声明提升,在输出语句之前,严格来说是函数定义时,会将a提前声明,可以理解为输出语句前有一行代码 var a
// 因此在输出语句执行时,是有a这个变量的,并且值为undefined
二、
fn();
function fn() {
console.log('fn');
}
// fn
三、
var fn = 'abc'
function fn() {
console.log('test')
}
fn()
//Uncaught TypeError: fn is not a function
四、
fn()
var fn = 'var'
function fn() {
console.log('fn')
}
// fn
五、
var a=1;
function b(){
console.log(a);
if(!a){
var a=10;
}
console.log(a);
}
b();
// undefined 10
六、
a();
function a() {
console.log(1);
}
a();
function a() {
console.log(2);
}
a = function () { console.log(3); }
a();
// 2 2 3
七、
a = function () { console.log(1); }
a();
function a() {
console.log(2);
}
a();
// 1 1
八、
var a = 1;
function a() {
console.log(2);
}
console.log('a : ', a);
// a : 1

把这些题目拿下,基本能应付大厂变量提升面试题了!