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

Javascript 为什么函数声明在不同的浏览器中处理方式不同?,javascript,firefox,google-chrome,Javascript,Firefox,Google Chrome,尽管我在google中找不到对这一点的引用,但我很熟悉这样一个事实:在javascript中,全局函数声明在执行任何代码之前都会得到解释。换句话说,这很好: f(); function f() {} 然而,我注意到chrome和firefox对全局函数声明有不同的解释。特别是,chrome很乐意在第一遍阅读if块中的函数声明,但firefox却不是 try {document.write(f);} // works in chrome catch(e) {docum

尽管我在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() {}
你可以自己用这个来试试这个例子。我正在使用Chrome16.0.912.75和Firefox9.0.1


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

函数声明在块中无效。你有未定义的行为,这是未定义的

顶层(全局或函数内的顶层)的函数声明被挂起

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

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

SyntaxError:在严格模式代码中,函数只能在顶层声明,或者直接在另一个函数中声明。

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


有关这个问题的详细讨论,请参阅。

好吧,那么为什么Chrome会如此轻松地吞下它们呢?谁知道呢?提交错误报告。@Chris我不知道为什么Chrome和Firefox会以特定于实现的方式实现这种未定义的行为。但是,它不能再被删除,因为这将破坏与Internet的向后兼容性。实际上,规范在这里定义了行为:它被定义为一个语法错误。我发现这是JavaScript的一个令人不安的限制——而且令人惊讶,因为函数是一流的对象。然后我意识到函数可以在块内声明,但它需要不同的语法:
var g=function(){}
,我记得,他们在这个问题上达成了一致。不过,我可能记错了。这里有更多信息:在代码顶部添加将使行为正常化。