为什么函数声明在不同的浏览器中处理方式不同?
尽管我在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() {}
你可以用这个小提琴自己试试这个例子。 我使用Chrome 16.0.912.75和Firefox 9.0.1。
这种行为的ECMA标准是什么? 有没有一个术语“解除”其他代码之上的函数声明? 是什么代码被“解除”了解释(都是浏览器的权利)? 或者它是其中之一的错误?
函数声明在块中无效。 你有未定义的行为,这是未定义的。
在顶层(函数内的全局或顶层)的函数声明被提升。
块内的函数声明是严格模式下的语法错误
(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.
此行为的ECMA标准是在解析脚本时引发SyntaxError。 不幸的是,Raynos说这样做与网络不兼容。
根据标准查看哪个JS函数声明语法是正确的? 对这个问题进行一些扩展讨论。
链接地址: http://www.djcxy.com/p/96275.html上一篇: Why are function declarations handled differently in different browsers?
下一篇: Why does a module level return statement work in Node.js?