1

最近我注意到 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

火狐输出:

ReferenceError: B is not defined

但是,如果我在调用之前放置 的定义,则 Firefox没有抱怨并且给出与其他浏览器相同的结果function B,如下所示:

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

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

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

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

函数调用时必须在作用域内,但函数声明可以在调用下方

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

在试图缩小原因时,我在这里读到了函数提升 ,它说 Firefox 在块内时不做提升,但在我的情况下,定义从来没有在语句中,所以我很困惑。ifif

4

1 回答 1

3

Firefox does not hoist function declarations outside of for blocks either. ECMA standard says it's okay. The documentation you linked to is not applicable only to if blocks, but for blocks as well.

于 2013-09-05T16:14:05.417 回答