簡體   English   中英

函數聲明或函數表達式

[英]Function declaration or function expression

我在塊范圍中定義函數時遇到了問題。 考慮以下程序:

try {
    greet();

    function greet() {
        alert("Merry Christmas!");
    }
} catch (error) {
    alert(error);
}

我希望這個程序能夠提醒Merry Christmas! 但是在Firefox中給出了以下ReferenceError

ReferenceError: greet is not defined

在Opera和Chrome上,它會像我預期的那樣提醒問候語。

顯然,Firefox將塊范圍內的FunctionExpression視為FunctionExpression而Opera和Chrome將其視為FunctionDeclaration

我的問題是為什么Firefox表現不同? 哪種實現更符合邏輯? 哪一個符合標准?

我理解JavaScript中的聲明是懸而未決的,因此如果在同一范圍內的兩個或多個不同的塊中聲明相同的函數,那么就會出現名稱沖突。

但是,每次聲明函數時重新聲明函數都不是更合乎邏輯,這樣你就可以做到這樣的事情:

greet(); // Merry Christmas!

function greet() {
    alert("Merry Christmas!");
}

greet(); // Happy New Year!

function greet() {
    alert("Happy New Year!");
}

我認為除了解決上面描述的塊范圍問題之外,這將非常有用。

實際上,塊作用域內的函數聲明明確地不是標准化的,並且行為是依賴於實現的。 不同的實現反應不同。 如果你試圖在if語句中聲明一個函數,你會得到同樣的怪異。

ES5規范建議實現者將塊內的函數聲明標記為警告或錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM