为什么Chrome处理本地功能的范围与Firefox不同?

时间:2015-09-22 03:03:40

标签: javascript google-chrome firefox

所以我做了一个小提琴并注意到我得到了不同的结果,一个没有错误,另一个是关于未定义的功能,具体取决于浏览器。

在Chrome中它功能完善且运行良好,但在Firefox中它提供了未定义的功能。

这是我用过的小提琴:

http://jsfiddle.net/98a45Lk9/ - 点击画布,然后在Chrome和Firefox中查看开发工具。

对我来说,我得到的是test 在Firefox中,我得到:ReferenceError: update is not defined

为什么这些浏览器以不同的方式处理JavaScript,因为它们似乎产生不同的结果,它们必须具有不同的规则?

我不知道其他浏览器的结果,例如IE和Opera。

1 个答案:

答案 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" - 推荐,而[火狐]将实施它。