以下代码片段在 Firefox 和 Chrome 中显示不同输出的任何原因:
var sayHo;
console.log(typeof(sayHey));
console.log(typeof(sayHo));
if(true) {
function sayHey() {
console.log("Hey, inside if");
};
sayHo = function() {
console.log("Ho, inside if");
};
}
else {
function sayHey() {
console.log("Hey, inside else");
};
sayHo = function() {
console.log("Ho, inside else");
};
}
sayHey();
sayHo();
Chrome(v31) 输出
- 功能
- 未定义
- 嘿,在其他里面
- 嗬,在if里面
Firefox(v26) 输出
- 未定义
- 未定义
- 嘿,里面如果
- 嗬,在if里面
我期望 Chrome 给出的输出相同。在解析时,里面的函数声明会覆盖if里面的函数声明。因为 JavaScript 会尝试提升两个函数声明,因此会覆盖。
最佳答案
Firefox 和 Chrome 使用不同的 JavaScript 引擎(分别为 SpiderMonkey 和 V8)。 Chrome 的行为可以被视为“错误”或“易用性功能”。在 V8 中,if 语句内的函数定义(而不是将匿名函数分配给变量)是在执行前执行的。这是一个设计决定。
关于javascript - if 语句中的函数语句和函数表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20825769/