我也不知道的js - let/var提升原理(var/let hoisting)

以前不怎么认真读js的MDN文档,后来看到了一位大佬对var/let/const 变量提升做了详细解释之后 有所顿悟,但是还有不明白的地方,自此记录下来,以免忘记

由于篇幅太长,我就不自己打一遍了,看看大佬的原文吧:我用了两个月的时间才理解 let

我的疑问

在大佬的文章里有这两段代码

代码1:
var foo
function foo(){}
console.log(foo)

代码2:
function foo(){}
var foo
console.log(foo)

问输出的是什么,你要是看了原文,你会发现大佬的这句话

答案:由于 function 比 var 多一个「赋值」过程,所以两个代码的输出都是函数。你也可以记住结论:function 比 var 牛逼。

但是我觉得大佬也没研究透,我想了想,也没研究透,仅仅做了几个设想

js的变量提升是有优先级的,var 的优先级比function的优先级高,也就是说无论你把var foo放哪里,都是先创建、初始化变量foo,然后再创建、初始化、赋值function foo,这样解释的话可以对代码1进行分解:a. 先创建变量a,然后初始化未undefined。 b.再创建function的变量、初始化、同时赋值未function(){}。c. 执行到var foo的时候 没有赋值,所以不做改动。 最终输出foo就是foo这个方法了
根据刚刚的,然后对 代码2 进行解析。解析步骤你会发现是一样的,最终你那个输出的都是foo的function。猜想和结论是一样的

结论: js引擎在执行代码的时候,从上到下

创建执行环境(执行域,各种叫法不一)
寻找有没有var的变量,进行提升(创建、初始化为undefined)
寻找有没有function的声明,进行提升(创建、初始化undefined,赋值)(这里我也不知道function还用不用初始化为undefined,因为还得赋值,有点多此一举,这可能只有js引擎开发的团队才知道了)
let跟var也是一样的,也会提升,仅仅创建,不做初始化

另一个猜想,就是大佬说的,function比var牛逼,但是我觉得,哈哈,不说了
欢迎大佬们指出帮助解惑

全部评论

相关推荐

10-25 00:32
香梨想要offer:感觉考研以后好好学 后面能乱杀,目前这简历有点难
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务