MDNのA re-introduction to JavaScript記事は、クロージャの議論で終了:クローズ - 常識?
別の関数内で定義された関数は、外側 関数の変数にアクセスすることができます。ここでの唯一の違いは、外側の 関数が返されているため、常識的には にローカル変数が存在しなくなることが示されているようです。
この記事では、スコープオブジェクトとスコープチェーンなどについて説明します。非常に洗練されたサウンドです。しかし、サンプルスクリプトを踏んで歩いても、常識がうまくいかない理由はありません。
function makeAdder(a) {
return function(b) {
return a + b;
};
}
var x = makeAdder(5);
var y = makeAdder(20);
x(6); // returns 11
y(7); // returns 27
だから、= Xを設定すると、引数で5 makeAdderします
x = function(b) {return 5 + b;};
を私たちは今、引数、6とxを呼び出すときに、私たちは11を返し
function(6) {return 5 + 6;};
を持っています。
私の質問は次のとおりです。私は何か不足していますか?閉鎖は単純だと思われる。なぜ人々はコンセプトに縛られるのだろうか?
非常に簡単で分かりやすいです。変数は通常、定義されたスコープの終わりにしか存在しないと予想されるかもしれないので、*常識*の発言があります。 'makeAddr'の呼び出しが終了して以来、' a'変数が解放されたことになるでしょう。それは解放されていない閉鎖のためです。 –
'x = function(b){return 5 + b;};'は実際には何も起こらないことに注意してください。つまり、関数は 'a'の値のコピーを取得するのではなく、その変数への参照を持っているので、' x = function(b){return a + b;}; 'のようになります。 a 'は依然として 'makeAddr'スコープの中で定義されています –
変数は解放/ガーベージされます。x = function(b){return 5 + b;}? Aはなくなった。 xだけが生き残っています。 –