所以我做了一个小提琴并注意到我得到了不同的结果,一个没有错误,另一个是关于未定义的功能,具体取决于浏览器。
在Chrome中它功能完善且运行良好,但在Firefox中它提供了未定义的功能。
这是我用过的小提琴:
http://jsfiddle.net/98a45Lk9/ - 点击画布,然后在Chrome和Firefox中查看开发工具。
对我来说,我得到的是test
在Firefox中,我得到:ReferenceError: update is not defined
为什么这些浏览器以不同的方式处理JavaScript,因为它们似乎产生不同的结果,它们必须具有不同的规则?
我不知道其他浏览器的结果,例如IE和Opera。
答案 0 :(得分:4)
代码使用顶级语句的FunctionDeclaration
外部(请参阅SourceElement
),从而调用浏览器定义的行为。
根据ECMAScript Grammar'正确'的解决方案是抛出一个SyntaxError,但由于实现接受了构造,因此放宽到merely a note in the specification。
注意已知几种广泛使用的ECMAScript实现支持将FunctionDeclaration用作Statement。然而,在应用于此类FunctionDeclarations的语义中的实现之间存在显着且不可调和的变化。 由于这些不可调和的差异,使用FunctionDeclaration作为Statement会导致代码在实现之间无法可靠移植。建议ECMAScript实现不允许使用FunctionDeclaration或在遇到此类用法时发出警告。 ECMAScript的未来版本可以定义用于在Statement上下文中声明函数的替代可移植方法。
总结:
function f () {
function g() {} /* FunctionDeclaration as SourceElement - OK! */
}
function f () {
if (x) {
function g() {} /* FunctionDeclaration as Statement;
Browser-defined behavior */
}
}
function f () {
var g;
if (x) {
g = function () {} /* FunctionExpression - OK! */
}
}
在Strict Mode中, Firefox 会抛出一个SyntaxError:
[在Firefox中] SyntaxError:在严格模式代码中,函数可能只在顶层声明或在另一个函数中立即声明
Chrome(45)和IE(11)都不遵循此可选行为。
此禁止不是严格模式,因为此类函数语句是基本ES5的扩展。但它是ECMAScript委员会的 - "Don't Pollute Strict Mode with Non-standard Declaration Forms" - 推荐,而[火狐]将实施它。