JavaScript閉鎖を理解する
6122 ワード
それは本当に理解するのが難しい概念でした、そして、閉鎖が何であるかについて理解するために、私はしばらくかかりました.したがって、ここではより良い可視化のためのダイアグラムとコードスニペットとは何かの私の理解です
私の脳を暖めるために、私はクロージャを含まない例を始めます、そして、最後に閉鎖を含む私の例をゆっくり変えます
function add1(){
var x = 1;
var f = function(y){
return x + y;
}
return f(3);
}
console.log(add1());
ここでは、単純な関数add1
. x
の値1
f
関数の指定add1
関数は関数を返すf
4
with x
= 1およびy
= 3関数宣言を持ち、その関数がコンソールに呼び出されます.ログ.実行コンテキストは次のようになります.
まず第一に、我々は
global execution context
作成中.私たちはcreation
and execution
フェーズ.にcreation
フェーズ、我々はホイストadd1
スコープの上部とexecution
フェーズを実行するadd1
機能呼び出し
add1
関数は作成するadd1
実行コンテキストは以下のようになります.この実行コンテキストでは、変数をホイストします
x
and f
にcreation
フェーズとその両方はcreation
フェーズ.にexecution
フェーズx
が1
and f
が引数を受け入れる関数に割り当てられますy
. 割り当て後、関数コールを返すf(3)
;これはFと呼ばれる別の実行コンテキストを作成します
f
実行コンテキストは、宣言された変数や関数が存在しないため、作成段階では何も上げません.実行段階では戻りますx+y
の値x
は、add1
実行コンテキストとy
が渡されるf(3)
総合的にx
is 1
and y
is 3
. 帰着4
. 各ECが実行された後、スタックは1つずつスタックからポップされる.スコープチェーンを見てみましょう
に
f
実行コンテキスト、x+y
. 値y
この文脈ではすぐに利用可能です3
しかし、値x
がない.したがって、外部実行コンテキストを参照し、x
は1
.Phewそれは大丈夫だった.うまくいけば、実行コンテキストとスコープを把握することができます.それで今、我々は閉鎖に関連している少し複雑な何かに移動する準備ができています.ここにコードスニペットがあります
var add = function() {
var x = 1;
var f = function(y) {
return x + y;
};
return f;
};
var g = add();
console.log(g(3));
この例では、関数への参照を返します.関数のスコープ外の関数を呼び出しますadd
時g(3)
が呼ばれる.おそらく、この部分は把握するのが難しいかもしれません.では、実行コンテキストをもう一度実行し、これがどのように追加されるかを見ましょう.グローバル実行コンテキスト
続いて
add
実行コンテキスト今面白い部分です.一度
add
実行コンテキストの終了を実行します.次にG ( 3 )実行コンテキストになります.変数を覚えておいてください
g
機能を含むf
それはadd
関数.So
g
はx + y
.走っているg(3)
だから価値y
3になります.の値は
x
? よく、我々が見回すならば、我々は見つけることができません
x
. でも覚えているx
が1
作成され、実行され、ポップされた別の実行コンテキストで.それで
Javascript
, 関数が他の関数の中で作成された場合g
. So g
の場合、囲む関数のスコープにある変数への参照を保持しますadd
. だから意味g
は、add
と変数x
. 基本的には
add
実行コンテキストは終了しましたがg
はまだ実行コンテキストの変数にアクセスすることができるadd
.機能
g
まだスコープチェーンを登ることができますx
実行スタックではありませんが、もう.g's
実行コンテキストclosed in
x
を返します.x's
実行コンテキストがなくなりました.だから我々の機能g
はclosure
. のようなクロージャ
g
関数は内部変数を参照する.スコープチェーンを見てみましょう
グローバル実行コンテキストスコープがあります.私たちは
add
and g
変数と実行コンテキスト.アフターライン
var g = add();
終了すると、追加実行コンテキストがスタックからポップされます.(この理由で陰影をつけられている)そして、
g
実行コンテキスト.それはまだ参照できるようになりますx
外部変数x's
実行コンテキストはスタック上にありません閉じるこの動画はお気に入りから削除されています.あなたがまだ混乱しているならば、以下のリファレンスを読んでください.
ここでは、私はこのトピックについてさらに理解するために使用する主な参照です
Ultimate guide to execution context
Reference
この問題について(JavaScript閉鎖を理解する), 我々は、より多くの情報をここで見つけました https://dev.to/yaminmhd/understanding-javascript-closures-1fk7テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol