javascriptの白はガイドブックの閉じた詳しい解を勉強します.

3287 ワード

クローズドを学ぶ前に、私はもうこのようないくつかの知識点を明らかにしてほしいです.第一、作用域第二、作用域チェーン第三、コンテキスト活動の対象を実行します.
まだ分からないことがあったら、それに応じて白の学習マニュアルを見てもいいです.
以下では、クローズドの概念を見てみましょう.クローズドは関数の局所変数の集合です.ただし、これらの変数は関数が戻ってきてからも継続的に存在します.
第二の解釈:クローズドとは関数の「スタック」であり、関数が戻った後は解放されないということであり、これらの関数スタックはスタック上ではなくスタック上で割り当てられているということも理解できる.
第三の解釈:関数内で他の関数を定義すると、クローズドが発生します.本質的には、クローズドは関数内部と関数外部を連結する橋です.
コンセプトを言いました.私たちはクローズドの基本的な使い方を見てみます.
function fn(){
    var max = 10;
    return function(x){
        if(x>max) console.log(x)
    }
}
var f1 = fn();
f1(15);// 15
なぜですか関数fnを変数f 1に割り当てましたが、関数fnは戻りの関数ですので、この戻りの関数を呼び出して、この匿名関数に外部の関数を呼び出す変数maxにパラメータ15を伝えます.しかし、関数fnはすでに実行済みです.ルール関数に従って実行した後、この関数の変数は破壊されるべきです.しかし、私たちが戻ってきた匿名関数がこの変数を呼び出したので、この変数は破壊できません.この変数はメモリに保存し続けなければなりません.この匿名関数が実行された後にこの変数は破棄されます.
var max = 10;
var fn = function(x){
    if(x>max){
        console.log(x)
    }
}

(function(f){
    var max = 100;
    f(15);
})(fn)
ここf(15)は実行後の出力は何ですか?これは自動運転匿名関数パラメータfです.呼び出し時に上記の関数に割り当てられました.そして、私達は15に入ってこの匿名関数に変数maxを呼び出しました.ここでこの変数maxはいくらですか?そうです.この変数maxは10で、100ではありません.なぜこれはアクティブなオブジェクトのコンテキスト実行に関する知識が含まれていますか?
function f1(){
    var n=999;
    nAdd=function(){n+=1}
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999
  nAdd();
  result(); // 1000
このコードの中で、resultは実はクローズドf 2関数です.全部で二回運行しました.一回目の値は999、二回目の値は1000です.これは、関数f 1の局所変数nがメモリに保存されており、f 1呼び出し後に自動的に消去されないことを証明している.どうしてですか?f 1はf 2の親関数であり、f 2はグローバル変数を与えられ、f 2は常にメモリにあり、f 2の存在はf 1に依存しているため、f 1も常にメモリにあり、呼び出しが終了した後、ゴミ回収メカニズムによって回収されることはない.このコードのもう一つの注目すべき点は、「nAdd=function(){n+=1]」という行は、まずnAddの前にvarキーワードが使用されていないので、nAddは局所変数ではなくグローバル変数です.第二に、nAddの値は匿名関数であり、この匿名関数自体もクローズドであるため、nAddは相当であり、関数の外部で関数内部の局所変数を操作することができる.