javascript - if 语句中的函数语句和函数表达式

标签 javascript

以下代码片段在 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) 输出

  1. 功能
  2. 未定义
  3. 嘿,在其他里面
  4. 嗬,在if里面

Firefox(v26) 输出

  1. 未定义
  2. 未定义
  3. 嘿,里面如果
  4. 嗬,在if里面

我期望 Chrome 给出的输出相同。在解析时,里面的函数声明会覆盖if里面的函数声明。因为 JavaScript 会尝试提升两个函数声明,因此会覆盖。

最佳答案

Firefox 和 Chrome 使用不同的 JavaScript 引擎(分别为 SpiderMonkey 和 V8)。 Chrome 的行为可以被视为“错误”或“易用性功能”。在 V8 中,if 语句内的函数定义(而不是将匿名函数分配给变量)是在执行前执行的。这是一个设计决定。

关于javascript - if 语句中的函数语句和函数表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20825769/

相关文章:

javascript - Angular 2 捆绑和缩小

javascript - 使用 nodejs 发送对 html 的响应来使用 REST

javascript - 替代子空间以在 iframe 之间进行安全的跨域通信?

javascript - 尝试在 JavaScript 中加载时绘制图像

java - 高效的 Websocket 数据处理

javascript - HTML 自动化脚本

javascript - 获取未选中的单选按钮的名称

javascript - 可以使用 javascript/jQuery 沿曲线定位元素吗?

javascript - 将数组从 MVC Controller 传递到 Jquery

javascript - 在某个时间范围内有效的对象的搜索列表