nAdd
に機能が割り当てられているときと関係があります。クロージャを作成すると、ローカル変数の新しい "コピー"(より良い言葉がないため)が作成されることに注意してください。従って、result1
のn
は、result2
sn
と異なり、result3
のn
とは異なります。それらは分離しており、それぞれのクロージャは別のクロージャのn
にアクセスできません。この行で
ルック:
nAdd = function() {
n += 1;
}
これはnAdd
新しい閉鎖するたびに割り当てられます。この閉鎖は毎回n
の最新の「コピー」にのみ影響します。
あなたがそうしているとき。
var result1 = f1(); // assign nAdd for the first time, referring to result1's n.
var result2 = f1(); // re-assign nAdd, now it affects result2's n.
var result3 = f1(); // re-assign nAdd, now it affect result3's n.
nAdd
毎回新しい閉鎖が割り当てられました。前回、nAdd
にはresult3
のnのコピーが割り当てられました。
したがって、nAdd()
を入力すると、result3
の数字はn
となります。
これは、物事をクリアするかもしれない例です。
function f1() {
var n = 999;
nAdd = function() {
n += 1
}
function f2() {
alert(n);
}
return f2;
}
var result1 = f1();
var nAdd1 = nAdd;
var result2 = f1();
var nAdd2 = nAdd;
var result3 = f1();
var nAdd3 = nAdd;
nAdd3();
result1(); //999
result2(); //999
result3(); //1000
nAdd1();
result1(); // 1000
nAdd1();
result1(); // 1001
nAdd2();
result2(); // 1000
nAdd();
result3(); // 1001 (the most recent nAdd result3's n).
精巧促進するために、あなたの代わりにこれをしなかったらどうなるか考えてみます。
var result1 = f1();
nAdd();
var result2 = f1();
var result3 = f1();
result1(); // 1000
result2(); // 999
result3(); //999
またはこの:
var result1 = f1();
var result2 = f1();
nAdd();
var result3 = f1();
result1(); // 999
result2(); // 1000
result3(); // 999
それはそのnAdd
更新が唯一の最も最近の呼び出しのn
明らかになりました!
"これは毎回nAddに新しい機能を割り当てます。この機能はたびにnの最新のコピーにのみ影響します。なぜ機能は最新のコピーにのみ影響しますか? – Tommy
@Tommyローカル変数の新しいセットが毎回作成されます。クロージャをnAddに割り当てると、クロージャはローカル変数の最新のセットを参照します。ただし、関数を呼び出すたびにnAddを上書きします。したがって、 nAddは、(result3に代入する)最新の呼び出しの変数のみを参照するため、result3のnにのみ影響します。 result3に割り当てる前にnAdd呼び出しを移動して、出力にどのように影響するかを確認してください。 –
@GiorgianThanks!あなたの答えとEluneの答えはどちらも素晴らしいです!私はそれを扱うと思う。 – Tommy