函数声明或函数表达式

问题描述 投票:0回答:1

我刚刚在块作用域中定义函数时遇到了问题。考虑以下程序:

try {
    greet();

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

我希望这个程序能够发出警报

Merry Christmas!
。然而在 Firefox 中却给了我以下
ReferenceError
:

ReferenceError: greet is not defined

在 Opera 和 Chrome 上,它会按照我的预期提醒问候语。

显然 Firefox 将块作用域内的函数视为

FunctionExpression
,而 Opera 和 Chrome 将其视为
FunctionDeclaration

我的问题是为什么 Firefox 的行为有所不同?哪种实现更符合逻辑?符合哪一项标准?

我知道 JavaScript 中的声明是提升的,因此如果在同一范围内的两个或多个不同块中声明相同的函数,则会出现名称冲突。

但是,每次声明该函数时都重新声明该函数不是更合乎逻辑,这样您就可以执行以下操作:

greet(); // Merry Christmas!

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

greet(); // Happy New Year!

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

我认为除了解决我上面描述的块范围问题之外,这将非常有用。

javascript scope ecmascript-5
1个回答
5
投票

实际上,块作用域内的函数声明显然是不是标准化的,并且行为取决于实现。不同的实现响应不同。如果您尝试在 if 语句中声明函数,您也会遇到同样的奇怪情况。

ES5 规范建议实现者将块内的函数声明标记为警告或错误。

© www.soinside.com 2019 - 2024. All rights reserved.