浏览器之间的Javascript函数定义/调用差异

时间:2013-09-05 16:08:02

标签: javascript firefox

最近我注意到Firefox和其他浏览器之间存在以下javascript代码的行为差异:

var condition = true;
A();

function A() {

    var x=0;

    for(var i=0; i<10; i++) {
        if(condition) {
            ++x;
            B();
        }

        function B() {
                console.log("B function. x = "+x);
        }
    }
}

Chrome,Opera,IE输出:

B function. x = 1
B function. x = 2 
B function. x = 3
B function. x = 4
B function. x = 5
B function. x = 6
B function. x = 7
B function. x = 8
B function. x = 9
B function. x = 10

Firefox输出:

ReferenceError: B is not defined

然而,如果我在调用之前输入function B的定义,那么来自Firefox的没有投诉并提供与其他浏览器相同的相同结果,像这样:

for(var i=0; i<10; i++) {

        function B() {
                console.log("B function. x = "+x);
        }

        if(condition) {
            ++x;
            B();
        }
    }

基于Mozilla开发者网站的引用:

  

函数在调用时必须在范围内,但函数声明可以在调用

之下

我理解通话,A()有效。但是,当调用在定义之前时,我不清楚为什么Firefox和其他人在调用B()时的行为有所不同。

在尝试缩小原因的同时,我读到了功能提升 here,其中说Firefox在if块内没有挂起,但定义从未在我的案例中if语句中,所以我很困惑。

1 个答案:

答案 0 :(得分:3)

Firefox也不会在for块之外提升函数声明。 ECMA标准说没关系。您链接到的文档不仅适用于if块,也适用于for块。