跨浏览器Javascript函数范围问题
下面的javascript在Chrome和IE中工作,但在Firefox中出错,因为在分配给callBar时,bar是未定义的 那么谁的范围规则是正确的呢跨浏览器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规范,不确定是谁“正确”了,
function foo() {
var callBar = bar;
if (1 === 1) {
callBar();
function bar() {
alert('yo');
}
}
}
foo();
根据ECMA规范,不确定是谁“正确”了,但这并不重要,因为您不能在所有浏览器中都这样做,必须更改代码:)
简单的解释是,if
语句中的函数
s在技术上是不允许的,浏览器会用它们做一些奇怪的事情。一些浏览器将其视为表达式,另一些浏览器将其视为声明。FF显然将其视为一个表达式,这意味着在代码到达该点之前它不存在。根据ECMA规范,详细的说明可在上找到,但不确定是谁“正确”了,但这并不重要,因为您不能在所有浏览器中都这样做,必须更改代码:)
简单的解释是,
if
语句中的函数
s在技术上是不允许的,浏览器会用它们做一些奇怪的事情。一些浏览器将其视为表达式,另一些浏览器将其视为声明。FF显然将其视为一个表达式,这意味着在代码到达该点之前它不存在。详细的总结可以在上找到,虽然这是一个有趣的脑筋急转弯,但你真的有这样的代码吗?函数(应该)被提升,因此有条件地定义它们是没有意义的。尽管这是一个有趣的脑筋急转弯,你真的有这样的代码吗?函数(应该)被提升,因此有条件地定义它们是没有意义的。