Javascriptは勉強ノートを閉じます.
1847 ワード
1、クローズドとは何ですか?
「javascriptアドバンスト・プログラム設計」の説明:別の関数作用領域の変数関数にアクセスする権利があります.もう一つの説明があります.一つの関数が外部変数にアクセスしたら、それは閉じられています.
私の理解では、クローズドは、外部変数にアクセスすることによって、機能領域の制限を超えてその変数にアクセスできる関数であり、関数のAPIインターフェースやブリッジのようなものである.
自分の考えを理解するために、簡単な概念から一歩ずつ始めます.
2、ゴミ回収メカニズム
コード図を見る:
1、マーククリア:マーククリアはアクティブクリアに属し、最も一般的な方法で、多くのブラウザはこのような方式を採用しています.変数が環境に入ると、この変数は「環境に入る」とラベル付けされます.論理的には、環境に入る変数によって占有されるメモリは永遠に解放されません.実行ストリームが環境に入ると、それらを使うことができるからです.変数が環境から離れると、環境から離れるとマークされます.ゴミ収集器は実行時にメモリに格納されているすべての変数にマークを付けます.次に、環境内の変数および環境内の変数によって参照される変数のタグを削除します.この後にマークを付けた変数は、環境内の変数がこれらの変数にアクセスできなくなっているため、削除を準備している変数と見なされます.最後にごみ収集器はメモリの消去作業を完了し、マーク付きの値を廃棄し、彼女たちが使っているメモリ空間を回収します.2、参照カウント:受動クリア.これはあまり一般的ではないゴミの収集戦略です.知りたい仲間は、「Javascript高級プログラム設計」を自分で翻訳してもいいです.
つまり、関数が実行されたら、関数内の変数は回収され、メモリは消去されます.
3、クローズドの例
クロージングは2回実行され、aの値はそれぞれ11と12であることがわかる.これは何を説明しますか?a=11の場合、fn()を離れると、aの値を廃棄していないと説明します.aは依然としてメモリに保存されていますが、上に述べたように、fn()が実行された後、ゴミ回収メカニズムは自動的に環境変数を破壊します.なぜfn()が実行された後、aはまだ存在しますか?
fn()の後に関数が返されるので、この関数も新しい作用領域を作成します.これもちょうどfn中の変数aを引用していますので、aは回収できません.回収は参照できません.次に、リセットされた関数を呼び出して、aの値を変更します.しかし、一旦クローズドクローズド関数が実行されると、回収されます.
ですから、私たちはよくクローズドの二つの特徴が見られます.2、ある関数にアクセスできる変数.
同時にこれらの原因の存在のため、クローズドはまた弊害があります:メモリが漏れやすくて、メモリの占用も性能を下げます.
午後は資料を見て、たくさんの大神さんのブログの考えを書いた学習ノートを読みました.もし理解が間違っていたり、どこがよくわからなかったりしたら、注意してください.ありがとうございます.
「javascriptアドバンスト・プログラム設計」の説明:別の関数作用領域の変数関数にアクセスする権利があります.もう一つの説明があります.一つの関数が外部変数にアクセスしたら、それは閉じられています.
私の理解では、クローズドは、外部変数にアクセスすることによって、機能領域の制限を超えてその変数にアクセスできる関数であり、関数のAPIインターフェースやブリッジのようなものである.
自分の考えを理解するために、簡単な概念から一歩ずつ始めます.
2、ゴミ回収メカニズム
コード図を見る:
function fn(){
var a = 1;
}
fn()
console.log(a); //
私たちはすべてのことを知っています.consolie.logs(a)は関数の作用域外では関数内の変数にアクセスできないため、エラーを報告します.なぜですか?jsにゴミ回収の仕組みがあるからです.Javascriptの高級なプログラム設計の中の説明を参考にして、ゴミ回収のメカニズムを説明します.1、マーククリア:マーククリアはアクティブクリアに属し、最も一般的な方法で、多くのブラウザはこのような方式を採用しています.変数が環境に入ると、この変数は「環境に入る」とラベル付けされます.論理的には、環境に入る変数によって占有されるメモリは永遠に解放されません.実行ストリームが環境に入ると、それらを使うことができるからです.変数が環境から離れると、環境から離れるとマークされます.ゴミ収集器は実行時にメモリに格納されているすべての変数にマークを付けます.次に、環境内の変数および環境内の変数によって参照される変数のタグを削除します.この後にマークを付けた変数は、環境内の変数がこれらの変数にアクセスできなくなっているため、削除を準備している変数と見なされます.最後にごみ収集器はメモリの消去作業を完了し、マーク付きの値を廃棄し、彼女たちが使っているメモリ空間を回収します.2、参照カウント:受動クリア.これはあまり一般的ではないゴミの収集戦略です.知りたい仲間は、「Javascript高級プログラム設計」を自分で翻訳してもいいです.
つまり、関数が実行されたら、関数内の変数は回収され、メモリは消去されます.
3、クローズドの例
var b = 0;
function fn () {
var a = 10;
return function (){
b += 1;
a += 1;
console.log(a)
}
}
var closure = fn();
closure() // 11
closure() // 12
これは、closure(returnによって出てくる関数)がクローズド関数である簡単なクローズド・インスタンスである.クロージングは2回実行され、aの値はそれぞれ11と12であることがわかる.これは何を説明しますか?a=11の場合、fn()を離れると、aの値を廃棄していないと説明します.aは依然としてメモリに保存されていますが、上に述べたように、fn()が実行された後、ゴミ回収メカニズムは自動的に環境変数を破壊します.なぜfn()が実行された後、aはまだ存在しますか?
fn()の後に関数が返されるので、この関数も新しい作用領域を作成します.これもちょうどfn中の変数aを引用していますので、aは回収できません.回収は参照できません.次に、リセットされた関数を呼び出して、aの値を変更します.しかし、一旦クローズドクローズド関数が実行されると、回収されます.
ですから、私たちはよくクローズドの二つの特徴が見られます.2、ある関数にアクセスできる変数.
同時にこれらの原因の存在のため、クローズドはまた弊害があります:メモリが漏れやすくて、メモリの占用も性能を下げます.
午後は資料を見て、たくさんの大神さんのブログの考えを書いた学習ノートを読みました.もし理解が間違っていたり、どこがよくわからなかったりしたら、注意してください.ありがとうございます.