Why are function declarations handled differently in different browsers?
虽然我在google中找不到对此的引用,但我很熟悉这样一个事实,即在javascript中,全局函数声明在任何代码执行之前都会得到解释。 换句话说,这很好用:
1 2 | f(); function f() {} |
但是,我注意到chrome和firefox对全局函数声明的解释有不同的解释。 特别是,chrome很高兴在第一遍中读取一个if块内的函数声明,但firefox却没有。
1 2 3 4 5 6 7 8 | 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() {} |
你可以用这个小提琴自己尝试这个例子。 我使用的是Chrome 16.0.912.75和Firefox 9.0.1。
这种行为的ECMA标准是什么? 这个"提升"函数声明的过程是否有一个术语高于其他代码? 什么代码被"解除"对解释是开放的(两种浏览器都是正确的)? 或者是其中一个中的错误?
函数声明在块中无效。 您有未定义的未定义行为。
顶层的函数声明(函数中的全局或顶级)被提升。
块内的函数声明在严格模式下是语法错误
1 2 3 4 5 6 | (function () { "use strict"; if (true) { function g() { } } })(); |
此行为的ECMA标准是在解析脚本时抛出SyntaxError。 不幸的是,正如Raynos所说,这与网络不兼容。
根据标准看哪个JS函数声明语法是正确的? 关于这个问题的一些扩展讨论。