js 变量声明易混淆的几点知识

变量增加优先级:函数 > 变量。

连续分配:可变晋升不包括分配。

if判断中的变量提升:不同浏览器的行为不一致。

函数作用域中的赋值:父作用域中的元素可以在子作用域中访问。

手把手教会你JavaScript引擎如何执行JavaScript代码

说白了,通过 JavaScript 引擎执行代码就像在高速公路上开车一样。
它首先查看地图(语法分析),然后导航(编译),最后踩油门(执行)。
这件事的复杂性在于编译和执行上下文的临时创建。

首先我们来说说最重要的编译阶段。
我们去年做的项目中最大的危险是我们不理解变量支持和词法环境之间的区别。
函数声明直接链接到窗口(去年私有变量几乎用作全局变量),let/const 绑定在块中。
如果你忘记在 3 000 级代码中添加括号,你就会遇到麻烦。
另一点是作用域链。
去年重构时,我发现嵌套函数更改了外部变量,但链不正确。
还有一个细节也很关键。
其绑定时间简直是个谜。
去年我用new写构造函数的时候,几乎没有正确初始化对象,因为它指向了null。

我最初以为this总是指窗口,但后来我发现箭头函数和对象方法并非如此。
老实说,这很令人困惑。
很多人不注意这一点。

最后,提醒一下。
如果使用得当的话,闭包就是最重要的。
如果使用不当,内存泄漏可能会让您彻夜难眠。
例如,在示例中,你总是可以在结果函数中获取a和b的值,但是如果你在循环中使用const handler=outer();循环完成后,数千个计数完成会占用内存。
我认为值得一试,但你必须知道如何完成它。