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分支中提升来优化,但这可能会破坏现有的应用程序 根据规范,哪一个是正确的?
答案 0 :(得分:2)
根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function,ECMAScript标准是在条件创建的块语句中重新提升函数声明,这就是Chrome 49似乎正在做的事情。
然而,在ECMAScript 6之前,在条件块中声明函数的行为是未定义的 - 浏览器可以使用该条件创建机制,提升他们看到的第一个(或最后一个)函数(这就是Chrome 48似乎要做的事情),不要提升任何一个函数并在test();
上返回错误,或者甚至做一些非JavaScript相关的事情,最终可能会导致计算机着火。