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

Javascript function definition/call difference between browsers

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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输出:

1
2
3
4
5
6
7
8
9
10
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输出:

1
ReferenceError: B is not defined

但是,如果我在调用之前输入function B的定义,那么Firefox没有任何投诉并且给出与其他浏览器相同的结果,如下所示:

1
2
3
4
5
6
7
8
9
10
11
for(var i=0; i<10; i++) {

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

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

基于Mozilla开发者网站的这句话:

Functions must be in scope when they are called, but the function declaration can be below the call

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

在尝试缩小原因的同时,我在这里阅读了关于函数提升的内容,其中说Firefox在if块内部时并没有提升,但在我的情况下,定义从不在if语句中,所以我很困惑。


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