无法访问的条件块中的函数声明

Yaş*_*ÇLİ 0 javascript

很有意思.你为什么这么认为?

var fn1 = function() {
    function fn2() {
        return "fn2 initialize...."
    }

    if (false) {
        function fn2() {
            return "fn2 if --> false"
        }
    }
    return fn2();
}

fn1();  // "fn2 if --> false"
Run Code Online (Sandbox Code Playgroud)

或者更有趣;

var fn1 = function() {
    function fn2() {
        return "fn2 initialize...."
    }

    if (false) {
        function fn2() {
            return "fn2 if --> false"
        }
    }
    return fn2();

    function fn2() {
        return "fn2 return after"
    }
}

fn1();  // "fn2 return after"
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 10

该代码中发生了两件事,其中一件是指定的行为,另一件在语法上无效(现在),其结果因JavaScript引擎而异.

无效位是您不能在条件块中具有函数声明.例如,这个位无效:

if (false) {
    function fn2() {
        return "fn2 if --> false"
    }
}
Run Code Online (Sandbox Code Playgroud)

一些引擎会将其视为函数声明,这意味着它不受逐步代码流的影响(因为函数声明不是,它们发生逐步流程之前).

其他引擎将(实际上)重写为您的函数表达式,将其置于逐步流程中.

我相信ECMAScript6将解决这个问题.

指定的位涉及在同一范围内只有两个声明,例如:

var fn1 = function() {
    function fn2() {
        return "the first fn2"
    }

    return fn2();

    function fn2() {
        return "the second fn2"
    }
};
fn1();  // "the second fn2"
Run Code Online (Sandbox Code Playgroud)

规范明确规定范围内的所有函数声明都按源代码的顺序处理,因此上面(删除了无效位)可靠地使用第二个fn2,而不是第一个.