var foo = function(){ return 1; };
if (true) {
function foo(){ return 2; }
}
foo(); // 1 in Chrome // 2 in FF
//I just want to be sure, is FF 4 not "standard" in this case?
编辑:
如果我们有这样的结果:
var foo = function(){ return 1; };
if (true) function foo(){ return 2; }
foo(); // is 1 standard or is 2 standard?
发布于 2011-04-23 02:02:34
ECMAScript标准不允许原始海报的代码。(出于法律原因,ECMAScript是JavaScript语言规范的正式名称。)然而,它是该语言的一个常见扩展--不幸的是,它在不同的浏览器中实现方式不同。
在标准JavaScript中,函数定义只能出现在顶层代码中,或者出现在函数体的顶层。在封闭函数体和函数定义之间不能有条件、循环,甚至不能有大括号。
例如,这是允许的:
function f() {
function g() {
...
}
}
但这不是:
function f() {
{
function g() {
...
}
}
}
让情况变得复杂的是,大多数浏览器都接受后一种代码,但每种浏览器都给它分配了自己独特的解释。Firefox对它的处理方式如下:
function f() {
{
var g = function g() {
...
}
}
}
ECMAScript委员会正在考虑为这些“函数语句”(而不是函数定义)选择一种特定的解释。他们还没有做出决定。Mozilla正在讨论其首选的解决方案here。
发布于 2011-04-23 02:01:22
问题中的代码实际上根本不被当前的ECMAScript语法所允许(从ECMAScript 5开始)。您可以在块内执行var foo = function() {}
,但只能在函数或脚本的顶层执行function foo() {}
。
目前,浏览器以不兼容的方式支持问题中的代码,因为它们都实现了对核心语言的扩展,并且它们实现了不同的扩展。在编译此脚本时,完全符合ECMAScript 5的实现实际上将以SyntaxError结束。
有人提议在ECMAScript中添加这类功能,但它们还没有完全敲定。
发布于 2011-04-23 02:03:06
对于没有在程序顶层或函数体顶层找到的函数声明,没有指定的行为。或者,指定的行为是一个语法错误,因为JavaScript语法不允许这样的函数声明。不同行为的原因是浏览器在历史上一直在这里的地图上,它们仍然如此,因为现有的网站使用浏览器特定的代码路径编写,使得任何人都不可能更改。
无论其价值如何,ECMAScript的未来版本很可能会定义它。但现在你不应该使用它,因为它的行为并不是由规范精确定义的,而且你会在不同的浏览器中得到不同的行为。
https://stackoverflow.com/questions/5758042
复制相似问题