[英]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.