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

尽管我在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?