一、 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)
console.log(a) var a = 2 在编译阶段,编译器会将其变成以下执行
var a console.log(a) a = 2 使用var,我们能够对一个变量进行多次声明,后面声明的变量会覆盖前面的变量声明
var a = 2 var a = 3 console.log(a) 在函数中使用使用var声明变量时候,该变量是局部的
var a = 2 function change(){ var a = 3 } change() console.log(a) 而如果在函数内不使用var,该变量是全局的
var a = 2 function change(){ a = 3 } change() console.log(a)
|
二、函数声明提升
通过function声明的函数,在其声明的地方之前就能够进行调用
!!!注意:函数表达式 不会提升 因为等号是赋值 不是声明
1 2 3 4 5 6
| 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()
二、 fn(); function fn() { console.log('fn'); }
三、 var fn = 'abc' function fn() { console.log('test') } fn()
四、 fn() var fn = 'var' function fn() { console.log('fn') }
五、 var a=1; function b(){ console.log(a); if(!a){ var a=10; } console.log(a); } b();
六、 a(); function a() { console.log(1); } a(); function a() { console.log(2); } a = function () { console.log(3); } a();
七、 a = function () { console.log(1); } a(); function a() { console.log(2); } a();
八、 var a = 1; function a() { console.log(2); } console.log('a : ', a);
|
把这些题目拿下,基本能应付大厂变量提升面试题了!