Javascript Firefox22.0范围错误?

Javascript Firefox22.0范围错误?,javascript,firefox,closures,Javascript,Firefox,Closures,我疯了吗-js可以在范围内转发引用,对吗 如果我是对的,这是Firefox22.0中严重的范围错误吗 if (true) { test(); function test() { alert("success"); } } 上面的代码失败,test()未定义。如果代码在If语句之外执行(或者如果函数定义被移到If语句之外???),那么一切都正常。在其他作用域(如do.)中也会发生相同的错误(未定义)。。而 上面的代码在IE和Chrome等中运行

我疯了吗-js可以在范围内转发引用,对吗

如果我是对的,这是Firefox22.0中严重的范围错误吗

if (true) { 

    test();

    function test() { 
        alert("success"); 
    } 
}
上面的代码失败,test()未定义。如果代码在If语句之外执行(或者如果函数定义被移到If语句之外???),那么一切都正常。在其他作用域(如do.)中也会发生相同的错误(未定义)。。而

上面的代码在IE和Chrome等中运行良好

*更新*


不确定期望能够做到这一点是愚蠢的还是不合理的(在sudo代码中语义上当然是有意义的)——但是js决定只有语句才能出现在这样的块中(正如引用basilikum的spidermonkey/ECMA内容的链接中所提到的那样)——所以不是——尤其是在浏览器处理不一致的情况下(如果不是在严格模式下)。谢谢大家。

Firefox对ECMAScript进行了非本机扩展


在ECMAScript中,在block语句中包含函数声明是无效的(尽管大多数浏览器允许它处于非严格模式),但在Firefox中,它们有一种称为function语句的语法,这是允许的。区别在于function语句不像函数声明那样在单独的过程中求值,因此它类似于函数表达式,在定义之前不能使用它。

看看这个:JavaScript中唯一的闭包范围是函数。
while
if
使用大括号,但它们不会创建作用域块。在
if
分支中声明函数在语义上没有任何意义。不要这样做。我稍微修改了这个问题以使其更有意义。是的,我应该使用术语scope而不是closure。更重要的是,我有uNL学到了一些不好的东西。现在有了完美的意义。遗憾的是,它在不同的浏览器中不一致!@LFN-如果使用严格模式,它是一致的。@LFN术语“范围”和“闭包”在JS中是可互换的。函数创建一个新的范围,同时创建一个闭包。
if
while
两者都不做。