搜索

首页  >  问答  >  正文

javascript - 高程中一个函数声明例子的困惑

《JavaScript 高级程序设计》第七章函数,关于函数声明的提升问题,有这样一个例子:

if(condition){
    function sayHi(){
        alert("Hi!");
    }
} else {
    function sayHi(){
        alert("Yo!");
    } 
}

书上原文说:

表面上看,以上代码表示在condition 为true 时,使用一个sayHi()的定义;否则,就使用另一个定义。实际上,这在ECMAScript 中属于无效语法,JavaScript 引擎会尝试修正错误,将其转换为合理的状态。但问题是浏览器尝试修正错误的做法并不一致。大多数浏览器会返回第二个声明,忽略condition;Firefox 会在condition 为true 时返回第一个声明。因此这种使用方式很危险,不应该出现在你的代码中。

但是我在 chrome 和 js bin里面测试,把 condition 改成 true,都能 alert“Hi”,并没有出现书上说的“大多数浏览器会返回第二个声明,忽略condition”的问题,这是为什么呢:

if(true){
    function sayHi(){
        alert("Hi!");
    }
} else {
    function sayHi(){
        alert("Yo!");
    } 
}
sayHi();// Hi!

求教,多谢!

淡淡烟草味淡淡烟草味2755 天前710

全部回复(2)我来回复

  • 为情所困

    为情所困2017-06-26 10:52:47

    true是一个字面量,不是一个变量,浏览器在解析的时候会把你这个if语句直接优化掉,类似于这样:

    if(true){
        function sayHi(){
            alert("Hi!");
        }
    } else {
        function sayHi(){
            alert("Yo!");
        } 
    }
    
    变成
    function sayHi(){
        alert("Hi!");
    }
    

    然而作者指的是另一种情况

    
    if(condition){
    function sayHi(){
        alert("Hi!");
        }
    } else {
        function sayHi(){
            alert("Yo!");
        } 
    }
    var condition = true
    sayHi()

    回复
    0
  • 三叔

    三叔2017-06-26 10:52:47

    编译器拿到这段代码以后,发现有两个处于同一个作用域中的重复函数声明,第一个声明会直接被第二个声明替换掉。
    js确实是不推荐在块内部声明函数的。
    在严格模式下,这段代码直接报错。

    回复
    0
  • 取消回复