Javascript 为什么函数声明在不同的浏览器中处理方式不同?
尽管我在google中找不到对这一点的引用,但我很熟悉这样一个事实:在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
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(){}
,我记得,他们在这个问题上达成了一致。不过,我可能记错了。这里有更多信息:在代码顶部添加将使行为正常化。