2

テストしたい無名関数を使用するコードがあります。コードは次の構造に従います (すべての関数は大きなマップにあります)。ただし、匿名関数をf2より大きな関数の外部の別の関数としてリファクタリングするhello3と、期待どおりに値が渡されません。なぜそうなのですか?値をパラメーターとして渡すことはできますが、根本的な原則も理解したいと考えています。

var bigMap = {
f2: function() {
    console.log("Closed over:" + name);
},

hello1: function(name) {
     return function() {
        console.log("Closed over:" + name);
    };
},

hello2:function(name) {
    var f1 = function() {
        console.log("Closed over:" + name);
    };
    return f1;
},


hello3:function(name) {
    return this.f2;
}
};

var f = bigMap.hello1("asad");
f(); // Outputs> Closed over:asad
f = bigMap.hello2("asad");
f(); // Outputs> Closed over:asad
f = bigMap.hello3   ("asad");
f(); // Outputs> Closed over: 
4

2 に答える 2

3

JS 関数はレキシカル クロージャです。これは、関数定義を物理的に囲む関数スコープで定義されている変数のみを閉じることを意味します。

f2変数を参照しますnameが、その関数または周囲の関数で定義されていないため、クロージャーに保存されません。これを -- の無名関数と--hello1の名前付き関数と比較し、それぞれがローカル変数を定義し、囲まれた関数がそれを参照できるようにします。f1hello2hello1hello2name

于 2013-07-06T03:17:40.510 に答える
1

これは、テスト容易性に関するものではなく、通常の js 変数のスコープに関するものです。オブジェクト「bigMap」のプロパティであるため、裸の単語 f2 をどこでも参照することはできません。つまり、「return f2」を「return bigMap.f2」に変更するだけで、関数 f2 が返されます。

于 2013-07-06T03:07:03.963 に答える