铬48和49之间的吊装行为有何变化?

时间:2016-03-24 16:47:59

标签: javascript google-chrome

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分支中提升来优化,但这可能会破坏现有的应用程序 根据规范,哪一个是正确的?

1 个答案:

答案 0 :(得分:2)

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

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