【发布时间】:2017-04-14 19:15:13
【问题描述】:
这是昨天在 TC39 上展示的。你可以找到要点here:
var p = () => console.log(f);
{
p(); // undefined
console.log(f); // function f(){}
f = 1;
p(); // undefined
console.log(f); // 1
function f(){}
p(); // 1
console.log(f); // 1
f = 2;
p(); // 1
console.log(f); // 2
}
有人可以向我解释一下这个东西是如何工作的吗?作为记录,它只能在非严格模式下工作。
谢谢。
【问题讨论】:
-
具体与托管有关?这个答案很好地解释了它:stackoverflow.com/questions/25111087/…
-
@CodingIntrigue:不,这不包括上面发生的事情,这是 ES2015 的 Annex B 和 TC39 的产物,它们尽最大努力引导现有代码和历史上不一致的实现的严重危险水域。 :-)
-
@T.J.Crowder 想详细解释一下吗?
function f(){}通常会在普通函数块内提升,第一个undefined应该打印函数 f 声明,但是现在在块内定义呢? -
@kstratis:我正在尝试,但我想非常小心,不要给你不正确的信息。仅供参考,相关位是B.3.3.1,尤其是步骤 1.a.ii.3 中的 jiggery-pokery。但我还没有详细阅读该部分(遗憾的是,我不得不退出)所以我手头没有准备好的解释。 令人着迷的情况。
-
@T.J.Crowder 感谢您的链接,看来问题比我意识到的要复杂。
标签: javascript function ecmascript-6 closures hoisting