ホームページ >ウェブフロントエンド >jsチュートリアル >Javascriptのスコープ+クロージャの詳細説明
[[スコープ]]:すべての JavaScript 関数はオブジェクトです。オブジェクト内の一部のプロパティはアクセスできますが、一部のプロパティは JavaScript エンジン [ [スコープ] からのみアクセスできます。 ]] もその 1 つです。
[[scope]] は、実行時コンテキストのコレクションを保存するスコープと呼ばれるものを指します。実行コンテキスト: 関数が実行されると、実行コンテキストと呼ばれる内部オブジェクトが作成され、関数が実行されるたびに対応する実行コンテキストは一意になるため、関数を複数回呼び出します。その結果、複数の実行コンテキストが作成され、関数の実行が完了すると、生成された実行コンテキストは破棄されます。
スコープ チェーン: [[スコープ]] に格納されている実行コンテキスト オブジェクトのコレクション。このコレクションはチェーンで接続されています。このチェーン リンクをスコープと呼びます。
function a(){ function b(){ function c(){ } } }
a が a.[[scope]] を定義 ===> 0: GO
a が a.[[scope]] を実行 0: aAO
1: GO
b が定義されました。 [[スコープ] ===&gt:go
b定義b。 ===> 0: bAO
2:GO
c 定義 c.[[スコープ]] ===> 0: cAO
1:baO
2: AAO g 3: GO
閉店
内部関数を外部に保存するとクロージャが生成され、元のドメインチェーンがおかしくなりメモリリークが発生します。
function a(){ function b(){ var bbb = 234; console.log(aaa); } var aaa = 123; return b; } var glob = 100; var demo = a(); demo();a 関数は破棄される前に b 関数を返すため、b 関数によって生成されたスコープ チェーンは破棄されず、この時点では b 関数は実行されません。 (aaa)、b関数が実行されます。 bAOには変数aaaがないので、親aAOに戻ると、aaa = 123が見つかり、結果は123になります。 では、どうすればその前にb関数を実行できるでしょうか。戻ってくる? 即時実行関数の紹介
初期化関数の関数として、
1. (function () {} ()) (w3c は最初のタイプを推奨します)
2. { })(); シンボリックに実行できるのは式のみです。関数式がシンボリックに実行された後は、関数を再度使用することはできません。プラス記号、マイナス記号を使用して関数式に変換できます。 、など
+/-/! function test(){ Console.log('a'); }function test(){ var arr = []; for(var i = 0;i < 10;i ++){ (function (j){ arr[j] = function(){ document.write(j+' '); } }(i)); } return arr; } var myarr = test(); for(var i = 0;i < 10;i ++){ myarr[i](); }出力結果は: 1 2 3 4 5 6 7 8 9 関連記事:
JavaScriptのスコープとクロージャ
JavaScript のスコープ チェーンとクロージャ
関連ビデオ:JS 高度なスコープ - Yan Shiba Javascript 高度なビデオ チュートリアル
以上がJavascriptのスコープ+クロージャの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。