为什么函数声明在不同的浏览器中处理不同?

时间:2012-01-15 18:00:47

标签: javascript firefox google-chrome

虽然我在google中找不到对此的引用,但我很熟悉这样一个事实:在javascript中,全局函数声明在任何代码执行之前都会得到解释。换句话说,这很好用:

f();
function f() {}

但是,我注意到chrome和firefox对全局函数声明的解释有不同的解释。特别是,chrome很乐意在第一遍中读取一个if块内的函数声明,但firefox不是。

try {document.write(f);}               // works in chrome
catch(e) {document.write(e.message);}  // throws an error in firefox

try {document.write(g);}               // works in chrome and firefox
catch(e) {document.write(e.message);}

if(true) function f() {}
function g() {}

您可以使用此fiddle自行尝试此示例。我使用的是Chrome 16.0.912.75和Firefox 9.0.1。

此行为的ECMA标准是什么?这个“提升”函数声明的过程是否有一个术语高于其他代码?什么代码被“解除”对解释是开放的(两种浏览器都是正确的)?或者是其中一个中的错误?

2 个答案:

答案 0 :(得分:11)

块中的函数声明不是有效。您有未定义的行为未定义。

最高级别的函数声明(函数中的全局或顶级)将被提升。

块内的函数声明是严格模式下的语法错误

(function () { 
  "use strict"; 
  if (true) { 
    function g() { } 
  } 
})();

SyntaxError: In strict mode code, functions can only be declared at top level or immediately within another function.

答案 1 :(得分:0)

此行为的ECMA标准是在解析脚本时抛出SyntaxError。不幸的是,正如Raynos所说,这样做与网络不兼容。

有关此问题的详细讨论,请参阅Which JS function-declaration syntax is correct according to the standard?