跨浏览器Javascript函数范围问题

跨浏览器Javascript函数范围问题,javascript,function,scope,Javascript,Function,Scope,下面的javascript在Chrome和IE中工作,但在Firefox中出错,因为在分配给callBar时,bar是未定义的 那么谁的范围规则是正确的呢 function foo() { var callBar = bar; if (1 === 1) { callBar(); function bar() { alert('yo'); } } } foo(); 根据ECMA规范,不确定是谁“正确”了,

下面的javascript在Chrome和IE中工作,但在Firefox中出错,因为在分配给callBar时,bar是未定义的

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

function foo() {

    var callBar = bar;

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

foo();
根据ECMA规范,不确定是谁“正确”了,但这并不重要,因为您不能在所有浏览器中都这样做,必须更改代码:)

简单的解释是,
if
语句中的
函数
s在技术上是不允许的,浏览器会用它们做一些奇怪的事情。一些浏览器将其视为表达式,另一些浏览器将其视为声明。FF显然将其视为一个表达式,这意味着在代码到达该点之前它不存在。根据ECMA规范,详细的说明可在

上找到,但不确定是谁“正确”了,但这并不重要,因为您不能在所有浏览器中都这样做,必须更改代码:)


简单的解释是,
if
语句中的
函数
s在技术上是不允许的,浏览器会用它们做一些奇怪的事情。一些浏览器将其视为表达式,另一些浏览器将其视为声明。FF显然将其视为一个表达式,这意味着在代码到达该点之前它不存在。详细的总结可以在

上找到,虽然这是一个有趣的脑筋急转弯,但你真的有这样的代码吗?函数(应该)被提升,因此有条件地定义它们是没有意义的。尽管这是一个有趣的脑筋急转弯,你真的有这样的代码吗?函数(应该)被提升,因此有条件地定义它们是没有意义的。