2011-11-17 48 views
1

以下javascript在Chrome和IE中可用,但在Firefox中出错,因为bar在分配给callBar时未定义。跨浏览器的Javascript函数范围问题

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

function foo() { 

    var callBar = bar; 

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

foo(); 
+0

虽然这是一个有趣的脑筋急转弯,你真的有这样的代码吗?函数(应该)被挂起,因此有条件地定义它们是没有意义的。 –

回答

5

不知道谁得到它“正确”根据ECMA规范,但它其实并不重要,因为你不能在所有的浏览器做到这一点,必须改变你的代码:)

简单的解释是if声明中的function s在技术上是不允许的,浏览器对它们做奇怪的事情。有些浏览器将此视为表达式,其他浏览器将其视为声明。 FF显然认为它是一个表达式,意味着它直到代码到达那一点才存在。详细的说明可在http://kangax.github.com/nfe/

+0

谢谢 - 很棒的阅读 –