跨浏览器Javascript函数范围问题

Bar*_*art 1 javascript scope function

以下javascript适用于Chrome和IE但在Firefox中出错,因为在分配给callBar时未定义bar.

那么谁的范围规则是正确的?

function foo() {

    var callBar = bar;

    if (1 === 1) {
       callBar();
       function bar() {
          alert('yo');
       }
    }
}

foo();
Run Code Online (Sandbox Code Playgroud)

Mar*_*ahn 5

根据ECMA规范,不确定是谁"正确",但它并不重要,因为你无法在所有浏览器中执行此操作并且必须更改代码:)

简单的解释是声明中的functions在if技术上是不允许的,浏览器对它们做了奇怪的事情.有些浏览器将此视为表达式,其他浏览器则视为声明.FF显然将其视为表达式,意味着在代码到达那一点之前它不存在.有关详细说明,请访问http://kangax.github.com/nfe/