【发布时间】:2017-09-06 04:31:05
【问题描述】:
Jason Orendorff 在let 和const 上的article 中声明如下:
Crunchy 性能细节:在大多数情况下,您可以判断 声明是否运行仅通过查看代码,所以 JavaScript 引擎实际上不需要执行额外的检查 每次访问变量以确保它已经 初始化。然而,在闭包内部,有时并不清楚。在 在这些情况下,JavaScript 引擎会进行运行时检查。这意味着
let可能比var慢一点。
我决定尝试找到一个例子,证明这是正确的并且被难住了。
例如,让我们看看下面的酷刑场景:
function doSomethingDumb(q) {
function crash() { ++x; }
q.fn = crash;
crash();
let x;
return crash;
}
即使在函数结束时返回闭包,也可以保证 return 语句永远不会执行,即使 x 已分配给 q 的成员(并且因此可能会逃到野外)x 永远不会被初始化,因此crash 将永远崩溃。
在什么情况下无法判断变量是否已经初始化?
【问题讨论】:
-
crash()甚至不会被执行,当您尝试将x分配给q.fn时,它已经崩溃了。 -
这应该是 q.fn = crash。感谢您了解这一点。
-
顺便说一句,你能把这篇文章和那个引用链接起来吗?
-
契约完成了。
标签: javascript ecmascript-6 closures let scoping