函数声明或函数表达式

时间:2012-12-25 03:34:37

标签: javascript scope function-declaration 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,而Opera和Chrome会将其视为FunctionDeclaration

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

我理解JavaScript中的声明是悬而未决的,因此如果在同一作用域中的两个或多个不同的块中声明相同的函数,则会发生名称冲突。

然而,每次声明函数时重新声明函数以便你可以做这样的事情是不合逻辑的:

greet(); // Merry Christmas!

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

greet(); // Happy New Year!

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

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

1 个答案:

答案 0 :(得分:5)

实际上,块作用域内的函数声明明确地标准化,并且行为是依赖于实现的。不同的实现反应不同。如果你试图在if语句中声明一个函数,你会得到同样的怪异。

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