3

次のコードは「true」を出力します。ff.f が未定義に等しい理由は理解できますが、この値を確認するときに ff.f 内で console.log("Hi") が実行されない理由がわかりません。f は定義するとすぐに実行されませんか?

var ff = function(){
    var f = function(){
        console.log("Hi");
    }();
};

console.log(ff.f === undefined);

[編集] この質問をするより良い方法は、「ff 内のこの f 関数はいつ実行されるのですか?」だと思います。ffが実行されるまで実行されないと、ff.fの値が「未定義」になるのはおかしいと思います。代わりに関数であるべきではありませんか?

4

1 に答える 1

4

いいえ、そうではありません - 一度評価されると実行されます - この場合は関数 ( ff) が実行されるときです。

いつf実行されるか

IIFE は、評価されると実行されます。他の関数内に含まれるそのような式は、スコープが設定された (ラップされた) 関数が実行されると評価されます。

// Executed when the execution flow reaches this point
// i.e. immediately after the script starts executing
var outer = function() {
    console.log("Hello from outer");
}();

var wrapper = function() {
    // Executed when the flow reaches this point
    // which is only when the function `wrapper`
    // is executed - which it isn't, so this never fires.
    var inner = function() {
        console.log("Hello from inner");
    }();
};

ff.f関数ではない理由

JavaScript は関数スコープですが、JavaScript は関数の内部スコープにアクセスする方法を提供していません (少なくとも、私が知る限り)。したがって、アクセスしようとすると、関数で名前が付けられたプロパティff.fを探しています。デフォルトでは、そのようなプロパティはありません。あなたがしたとしても:fff

var ff = function () {
    ff.f = function() {
        console.log("Hello from f");
    }();
};

ff.f( IIFEundefinedは何も返さないため)。

于 2012-09-14T02:46:03.790 に答える