Aad*_*hah 6 javascript scope function-declaration function-expression
我在块范围中定义函数时遇到了问题.考虑以下程序:
try {
greet();
function greet() {
alert("Merry Christmas!");
}
} catch (error) {
alert(error);
}
Run Code Online (Sandbox Code Playgroud)
我希望这个程序能够提醒Merry Christmas!.但是在Firefox中给了我以下内容ReferenceError:
ReferenceError: greet is not defined
Run Code Online (Sandbox Code Playgroud)
在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!");
}
Run Code Online (Sandbox Code Playgroud)
我认为除了解决上面描述的块范围问题之外,这将非常有用.
实际上,块作用域内的函数声明明确地不是标准化的,并且行为是依赖于实现的.不同的实现反应不同.如果你试图在if语句中声明一个函数,你会得到同样的怪异.
ES5规范建议实现者将块内的函数声明标记为警告或错误.
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |