Javascript-10(シャーシ閉鎖)


Closerを知りたいのですが、本当に散らかっています.
Closerについては、探した授業や本だけでもいくつかありますが、もちろん、そこまで調べてみれば少しはわかります.
それでも、何かを完全に知っているわけではないようだ.
しかし、時間をかけて他のことをもっと勉強して、戻ってきたとき、私はもっと理解しているような気がします.
だから私はこのようなことを書きたいです!!
まず,Closerとは関数とLexicalEnvironmentの組合せを指す.
(この言葉はもう難しい…ううう)
私が初めて理解したのは生活コードからです.
function outter() {
	let title = 'Excellent Coding';
	return function() {
		alert(title);
	}
}

inner = outter();
inner(); // Excellent Coding이 alert창으로 나온다!
このような例がある場合、outter functionは生命を返して終了するべきであるが、inner()はoutterでtitleを検索している.
つまり、外部関数が実行され、機能が消えた後も、内部関数は外部関数の変数にアクセスできます.
これは便利かもしれませんが、メモリがすぐに使用されます.これはメモリ漏れの原因かもしれません.
let one;
one = 1;

function addOne(num) {
	console.log( one + num );
}

addOne(5)
このような例があれば、上から下までどのように働いているのかを理解してみましょう.
1.コード実行後、JSの変数(one,addOne)がLexicalEnvironment(グローバルLexicalEnvironment)に入る
//oneの場合、メキシコ環境に入っていますが初期化されていないため使用できません
addOneの場合、関数宣言は変数とは異なり、すぐに初期化されるため、使用できます.

  • let one; : まだ割り当てられていないため、未定義の初期値があります.
    すでに初期化されていて、今使えます!(errではなく、定義されていないだけです!)

  • one = 1; : 1に数字1が指定されています

  • functionpart:関数宣言は初期に行われていたので、最後にスキップしました.

  • addOne(5); : addOneは、新しいLexicalEnvironment(内部LexicalEnvironment)を作成します.
    ここでは、関数が渡すパラメータと領域変数を格納します.
    内部LexicalEnvironmentのグローバルLexicalEnvironmentへの参照.
    すなわち,コード内で変数を検索する場合,内部になければ外部にもない場合,グローバル検索

  • console.log( one + num )
  • 最初に内部Lexican環境で
  • を検索
  • num=5は見つかりましたが、ありませんので、メキシコ全体の環境で検索して、一つあればもう一つ追加して、
  • 内部Lexicallで探し、なければ外部Lexicallで探し、そこにもなければグローバルLexicallで探します.
    =>このようにつながっているのがScope Chain!