我也不知道的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牛逼,但是我觉得,哈哈,不说了
欢迎大佬们指出帮助解惑