记录遇到的函数声明提升和变量声明提升的问题

481 阅读2分钟

函数和变量的声明

第一段代码来自前辈守候i的文章(juejin.cn/post/684490…)

alert(a)
a();
var a=3;
//a();//无法调用
function a(){
    alert(10)
}   
alert(a)
a=6;
a();

因为函数会先提示,才轮到变量,再加上JavaScript单线程执行代码。所以先预解析(寻找作用域中的var和function,对其进行先声明,在从上到下执行代码),alert(a)中a代表函数,所以在弹出框显示了整个函数体。a()接着调用了函数再次弹出显示10的警告框。var a = 3是声明一个变量并且赋值,这里有一个重点,变量声明不会覆盖函数,但是赋值会覆盖函数。所以这时函数a()已经无法调用了。注释掉a()后,继续向下执行。alert(a)会弹出显示3。接着a = 6,又有一个重点,var可以重复声明也可以重赋值。最后又是a(),浏览器会在sources直接显示TypeError: a is not a function。

变量声明和赋值

下面内容主要来自CSDN中小小飞肖的文章js函数声明提升优先级与变量声明提升优先级的关系

1、函数声明提升优先级比变量高,不会被变量声明覆盖,但会被变量赋值覆盖。 2、函数声明会覆盖变量声明,但不会覆盖变量赋值。可以试一下下面的代码

alert(a)
a()
var a;
a()
function a() {
    alert(6)
}
a=5;
a()

最重要的一点,JavaScript是单线程,从上到下执行。这里不涉及异步问题。

总结

虽然这是最基础的知识,但是写完这个笔记,感觉自己问题阐述的有点模糊,不是真正的掌握,希望路过的前辈们指点。