JavaScriptの中のクローズドについて話します.
1432 ワード
一、カバンを閉じるとは何ですか?
「JavaScriptアドバンスト・プログラム設計」には、「クローズドとは、別の関数のスコープにアクセスする変数の関数のことです」と書かれています.定義された観点から見れば、「クローズドは関数です」という意味です.疑問の気持ちを持ってまたネットで探してみましたが、どのような言い方があったか?結局はクローズドの意味が分かりませんでした.それともコードを見て直接に来ました.
二、クローズドの原理?
各関数には独自の実行環境があり、機能が実行されると、その実行環境は環境スタックに押し込まれ、その活動対象(記憶環境で定義された変数および関数)が作用領域チェーンに加わり、機能が実行されると、スタックはその環境をイジェクトし、活動対象は破棄される.
上記の例では、Outterが実行した後にinnerに戻ってreultを与え、outterの実行環境は環境スタックからはじき出し、制御権はグローバル環境に任せ、outterの活動対象は廃棄されるべきである.しかし、この時点でinnerはすでにグローバル活動の対象に格納されており、同時にinnerはskyにアクセスする必要があるので、outterの活動対象は破壊されていません.たとえreultが実行されたとしても、outterの活動対象は依然として作用領域チェーンに存在しています.
三、カバンを閉じて何に使いますか?
こんなに多いと言っていますが、閉パックはいったい何の効果がありますか?私は個人的には閉鎖の最大の用途は全体の作用域に対する汚染を防止することだと思っています.考えてみましょう.一度や二回だけの変数をグローバルスコープに宣言したら、最後は間違いやすく、維持できないです.クローズドの一番不思議なところは、関数外で関数にアクセスできる局部変数です.これらの変数をクローズドの形で関数に置くと汚染が防げます.
四、Caveatクローズドは、関数の活動対象をメモリに維持し、過度にクローズドを使用するとメモリが過剰に占有されます. クローズドは、外部関数のいずれかの変数の最後の値しか取得できません.ループを使用して返された関数に循環変数が含まれている場合、エラー結果が得られます. 戻る関数が匿名関数である場合、匿名関数のthisはwindowオブジェクトを指すことに注意する.
「JavaScriptアドバンスト・プログラム設計」には、「クローズドとは、別の関数のスコープにアクセスする変数の関数のことです」と書かれています.定義された観点から見れば、「クローズドは関数です」という意味です.疑問の気持ちを持ってまたネットで探してみましたが、どのような言い方があったか?結局はクローズドの意味が分かりませんでした.それともコードを見て直接に来ました.
function outter(){
var sky="blue";
function inner(){
console.log(sky);
}
return inner;
}
var result=outter();
result(); //"blue"
このコードには簡単なクローズドが含まれています.Outter関数の戻り値は関数であり、innerです.innerはoutter内部で、当然局所変数skyにアクセスすることができますが、innerがoutterの戻り値としてoutter外のグローバル変数に与えられた時、不思議なことに起こりました.二、クローズドの原理?
各関数には独自の実行環境があり、機能が実行されると、その実行環境は環境スタックに押し込まれ、その活動対象(記憶環境で定義された変数および関数)が作用領域チェーンに加わり、機能が実行されると、スタックはその環境をイジェクトし、活動対象は破棄される.
上記の例では、Outterが実行した後にinnerに戻ってreultを与え、outterの実行環境は環境スタックからはじき出し、制御権はグローバル環境に任せ、outterの活動対象は廃棄されるべきである.しかし、この時点でinnerはすでにグローバル活動の対象に格納されており、同時にinnerはskyにアクセスする必要があるので、outterの活動対象は破壊されていません.たとえreultが実行されたとしても、outterの活動対象は依然として作用領域チェーンに存在しています.
result = null;
outterの活動対象は完全に釈放されます.三、カバンを閉じて何に使いますか?
こんなに多いと言っていますが、閉パックはいったい何の効果がありますか?私は個人的には閉鎖の最大の用途は全体の作用域に対する汚染を防止することだと思っています.考えてみましょう.一度や二回だけの変数をグローバルスコープに宣言したら、最後は間違いやすく、維持できないです.クローズドの一番不思議なところは、関数外で関数にアクセスできる局部変数です.これらの変数をクローズドの形で関数に置くと汚染が防げます.
四、Caveat