javascript - 函数声明或函数表达式

标签 javascript scope function-declaration function-expression

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

try {
    greet();

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

我希望这个程序能提示Merry Christmas!。然而在 Firefox 中是给我以下 ReferenceError:

ReferenceError: greet is not defined

在 Opera 和 Chrome 上,它会像我预期的那样提醒问候语。

显然,Firefox 将 block 范围内的函数视为 FunctionExpression,而 Opera 和 Chrome 将其视为 FunctionDeclaration

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

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

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

greet(); // Merry Christmas!

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

greet(); // Happy New Year!

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

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

最佳答案

实际上, block 作用域内的函数声明显然不是标准化的,并且行为依赖于实现。不同的实现响应不同。如果您尝试在 if 语句中声明一个函数,您会遇到同样的怪事。

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

关于javascript - 函数声明或函数表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027467/

相关文章:

c++ - #include 指令的限制范围

c++ - 为什么 C 允许我调用未声明的函数?

c++ - 通过 "pass by value"将一个函数传递给另一个函数

javascript - Bootstrap - header 中的标识但不是 li-segment 的一部分

javascript - jquery 面板滑出和滑入 + 滚动

javascript - 如何在事件处理程序中访问变量 "this"

javascript - 未定义错误: create object with function that returns HTML element

c - 函数声明与原型(prototype)的替代 (K&R) C 语法

javascript - 多种字体大小 - Javascript/jQuery 打字效果

javascript - 如何在 ES6 语法中对导入使用深度解构?