関連書籍: JavaScript のプロトタイプとクロージャ シリーズについての私の理解を語る (Shuishhou Note 8)
クロージャーとは
クロージャとは何ですか? Closure は Closure で、静的言語にはない新しい機能です。しかし、クロージャは理解するのが難しいほど複雑なものではありません。つまり、クロージャは次のとおりです。• クロージャは関数のローカル変数のコレクションですが、これらのローカル変数は関数が戻った後も存在し続けます。
• クロージャとは、関数が戻った後に関数の「スタック」が解放されないことを意味し、これらの関数スタックはスタック上ではなくヒープ上に割り当てられることも理解できます。
• 関数内で別の関数を定義するとクロージャが生成されます
プロトタイプとは何ですか?
プロトタイプは、他のオブジェクトがプロパティの継承を実装できるオブジェクトです。
どんなオブジェクトでもプロトタイプになれますか?
はい
プロトタイプを持つオブジェクト
すべてのオブジェクトにはデフォルトでプロトタイプがあります。プロトタイプ自体もオブジェクトであるため、各プロトタイプ自体にもプロトタイプがあります (1 つの例外を除き、デフォルトのオブジェクト プロトタイプはプロトタイプ チェーンの先頭にあります)。実行コンテキスト
コントローラーが ECMAScript 実行可能コードに切り替わるたびに、コントローラーは実行コンテキストに入ります。
実行コンテキスト (略して EC) は抽象的な概念であり、ECMA-262 標準では、この概念を実行可能コードの概念と区別しています。
標準仕様では、技術実装の観点から EC のタイプと構造を正確に定義していません。これは、ECMAScript エンジンを具体的に実装するときに考慮すべき問題です。
アクティビティ実行コンテキストは論理的にスタックを形成します。スタックの一番下は常にグローバル コンテキストであり、スタックの一番上は現在の (アクティブな) 実行コンテキストです。スタックは、EC のさまざまな種類がプッシュまたはポップされると変更されます。
----------------------------------------------- --- ----------------------------------
js コードを取得して実際に文ごとに実行する前に、ブラウザーは値を割り当てる代わりに変数を宣言するなどの「準備作業」をすでに行っています。変数の代入は、代入ステートメントの実行時に実行されます。
「準備」フェーズでは、これは直接割り当てられます。
関数: 関数式と関数宣言
console.log(f1); //function f1() {} function f1() {} //函数声明 console.log(f2); //undefined var f2 = function() {}; //函数表达式
•変数、関数式————変数宣言、デフォルトの割り当ては未定義です
•これ————課題
•関数宣言————代入
これら 3 種類のデータを用意することを「実行コンテキスト」または「実行コンテキスト環境」と呼びます。
----------------------------------------------- --- ----------------------------------
JavaScript はコードセグメントを実行する前に、実行コンテキストを生成するためにこれらの「準備作業」を実行します。この「コードセグメント」は、グローバルコード、関数コード、および Eval コードの 3 つの状況に分割されます。
//全局代码段 <script type="text/javascript"> //代码段... </script> //函数代码段 function fn(x) { console.log(x + 5); } var fn = new Function("x", "console.log(x + 5)"); //Eval代码段 eval('var x = 10'); (function foo() { eval('var y = 20'); })(); alert(x); //10 alert(y); //"y" is not defined //因为eval涉及到安全问题(脚本注入),所以尽量不用。
関数には、「準備」のいくつかの状況に加えて、その他のデータも含まれます
function fn(x) { console.log(arguments); //[10] conosole.log(x); //10 } fn(10);
関数が呼び出されるたびに、新しいコンテキスト実行環境が生成されます。異なる呼び出しによって異なるパラメータが生成される可能性があるためです。
関数本体内の自由変数のスコープは、関数が定義されたとき (呼び出されていないとき) に決定されます。
概要:
グローバル コードのコンテキスト データの内容は次のとおりです:
•通常の変数 (関数式を含む): var a = 10 | ===> 宣言 (デフォルトの割り当ては未定義)
•関数 fn() {} などの関数宣言
•これ | ===>
関数本体
•パラメータ | ===>
•自由変数の値の範囲 | ====> 代入
コードを実行する前に、使用する変数をすべて事前に取り出し、いくつかは直接代入され、いくつかは最初に未定義で埋められます。
上記の内容は、編集者が共有した JavaScript プロトタイプとクロージャー シリーズの理解 (ランダムなメモ 6) の全説明です。気に入っていただければ幸いです。