我在块范围内定义函数时遇到了问题。考虑以下程序:
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!");
}
除了解决我上面描述的块范围问题之外,我认为这将非常有用。