Firefox 22.0 范围错误?[复制]

Firefox 22.0 scope bug? [duplicate]

提问人:LFN 提问时间:8/6/2013 最后编辑:LFN 更新时间:8/6/2013 访问量:142

问:

我是不是疯了 - js 可以在范围内转发引用,对吧?

如果我是对的,这是 Firefox 22.0 中一个严重的范围错误吗?

if (true) { 

    test();

    function test() { 
        alert("success"); 
    } 
}

上面的代码失败,test() 未定义。如果代码是在 if 语句之外执行的(或者如果只是函数定义移动到 if 语句??!?之外),那么一切正常。在其他作用域(如 do ..而等。

上面的代码在IE和Chrome等中工作正常!

* 更新 *

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

JavaScript Firefox 闭包

评论

1赞 basilikum 8/6/2013
看看这个: statichtml.com/2011/spidermonkey-function-hoisting.html
2赞 Tomalak 8/6/2013
JavaScript 中唯一的闭包范围是函数。 并使用大括号,但它们不会创建范围块。从语义上讲,在分支中声明函数没有任何意义。别这样。whileifif
0赞 LFN 8/6/2013
我稍微修改了这个问题,以使其更有意义。是的,我应该使用术语范围而不是关闭。更重要的是,我忘了一些不好的东西。现在很有意义。可惜它在浏览器之间不一致!
1赞 Spudley 8/6/2013
@LFN - 如果使用严格模式,则它是一致的。
0赞 Tomalak 8/6/2013
@LFN 术语“scope”和“closure”在JS中是可以互换的。函数创建一个新作用域,同时创建一个闭包。 或者两者都不做。ifwhile

答:

5赞 user2437417 #1

Firefox 有 ECMAScript 的非原生扩展。

在 ECMAScript 中,在 block 语句中包含函数声明是无效的(尽管大多数浏览器允许在非严格模式下这样做),但在 Firefox 中,它们有一种称为函数语句的语法,它确实允许这样做。不同之处在于,函数语句不像函数声明那样在单独的传递上计算,因此它类似于函数表达式,因为在定义它之前不能使用它。