这篇文章讲的很好,但是有一点讲错了,我补充一点,再加几个常见的面试题。
要点:
- 变量声明var 和函数声明function都会有声明的提升,提升到函数作用域或者全局作用域的顶端,后面提升的排在之前提升的后面,重复的会覆盖之前的声明。
- 先提升变量,相同的变量合并,赋值undefined,再提升函数。
举几个例子,常见的面试题的一部分
变量声明与函数声明的提升顺序
console.log(a) //Function
function a() {
return 4
}
var a = 3;
console.log(a) //3
//相当于
var a =undefined; //先提升变量,变量全部提升完后,再提升函数
function a(){
return 4
}
console.log(a)
a=3;
console.log(a)
变量声明的合并
console.log(a) //Function
var a=3;
function a(){
return 4
}
var a=4;
console.log(a) //4
//相当于
var a =undefined; //变量声明合并
function a(){
return 4
}
console.log(a)
a=3;
a=4;
console.log(a)
提升到函数作用域顶部
//注意
console.log( undefined === undefined ,typeof undefined === 'undefined'); //true true
var a = 4;
(function () {
console.log(a, typeof a === 'undefined')
if (typeof a === 'undefined') {
console.log('what')
var a = 5
console.log(a) //5
} else {
console.log('whatelse')
console.log(a)
}
})()
//相当于
var a=undefined;
a=4;
(function(){
var a=undefined; //提升变量到函数作用域顶端,并覆盖之前的声明
if(typeof a=== 'undefined'){
a=5
console.log(a)
}else{
console.log(a)
}
})()
函数声明提升
foo(); //'foo'
bar(); //TypeError bar is not a function
function foo(){
console.log('foo')
}
var bar = function(){
console.log('bar')
}
//相当于
var bar=undefined; //先提升变量
function foo(){ //提升函数声明
console.log('foo')
}
foo();
bar();
bar=function(){console.log('bar')}