JS变量提升(秒杀面试题)

1,934 阅读1分钟

juejin.im/post/684490…

这篇文章讲的很好,但是有一点讲错了,我补充一点,再加几个常见的面试题。

要点:

  1. 变量声明var 和函数声明function都会有声明的提升,提升到函数作用域或者全局作用域的顶端,后面提升的排在之前提升的后面,重复的会覆盖之前的声明。
  2. 先提升变量,相同的变量合并,赋值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')}