js变量和函数提升的小结

对于变量和函数一起的提升说法,我比较认同"LittleBear"的说法。

比如:

<script>
     console.log(a)//function a(){}
     var a=1;
     console.log(a)//1
     function a(){}
     console.log(a)//1
</script>

他觉得,是先预编译变量,先给a赋值undefined,后来预编译函数,函数a覆盖了之前的变量a的默认值; 然后代码顺序执行到a=1;,这个时候赋值表达式给a赋值为1,所以后面输出都是1。  

我觉得,在同一作用域中,变量和函数声明的提升顺序和"天天向上中"提到的一样:【函数形参声明--->函数声明---->变量声明 。任何一种声明,如果在前面出现,都不会再次声明。】

这个提升顺序和代码的先后顺序没关系。也就是,不管var a=1在function a(){}前面或者后面,都按照上面说的顺序来提升。

再比如下面的代码:(各位可参考上面的逻辑,自行解决[考的正是作用域内变量和函数声明的提升顺序])

a()
var a = c = function() {
    console.log(2)
}
a()

function a() {
    console.log(1)
}
a();
(function(b) {
    b(), c()
    var b = c = function a() {
        console.log(3)
    }
    b()
})(a)
c()

  

参考文章:

[转]谈谈我遇到的前端的一些神奇面试题--变量提升,函数提升

原文地址:https://www.cnblogs.com/simonbaker/p/4238002.html