关于javascript:chrome 48和49之间的提升行为发生了变化?

hoisting behavior changed between chrome 48 and 49 ?

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
if (true) {
  function test() {
    console.log(true);
  }
} else {
  function test() {
    console.log(false);
  }
}

test()

Chrome 48(和节点<5.9.1)记录为false,chrome 49(和firefox)记录为true。 我猜他们通过不从falsy分支中提升来优化,但这可能会破坏现有的应用程序。 根据规格哪一个是正确的?


根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function,ECMAScript标准是在块语句中重新提升函数声明以进行条件创建,这就是Chrome 49 似乎在做。

然而,在ECMAScript 6之前,在条件块中声明函数的行为是未定义的 - 浏览器可以使用该条件创建机制,提升他们看到的第一个(或最后一个)函数(这是Chrome 48似乎要做的),而不是提升 函数并在test();上返回一个错误,甚至做一些非JavaScript相关的事情,这些事情最终可能导致计算机着火。