JavaScript プロトタイプとクロージャーについての私の理解を語るシリーズ (ランダムメモ 6)_JavaScript スキル

WBOY
リリース: 2016-05-16 15:24:39
オリジナル
1209 人が閲覧しました

関連書籍: JavaScript のプロトタイプとクロージャ シリーズについての私の理解を語る (Shuishhou Note 8)

クロージャーとは

クロージャとは何ですか? Closure は Closure で、静的言語にはない新しい機能です。しかし、クロージャは理解するのが難しいほど複雑なものではありません。つまり、クロージャは次のとおりです。

• クロージャは関数のローカル変数のコレクションですが、これらのローカル変数は関数が戻った後も存在し続けます。

• クロージャとは、関数が戻った後に関数の「スタック」が解放されないことを意味し、これらの関数スタックはスタック上ではなくヒープ上に割り当てられることも理解できます。

• 関数内で別の関数を定義するとクロージャが生成されます

プロトタイプとは何ですか?

プロトタイプは、他のオブジェクトがプロパティの継承を実装できるオブジェクトです。

どんなオブジェクトでもプロトタイプになれますか?

はい

プロトタイプを持つオブジェクト

すべてのオブジェクトにはデフォルトでプロトタイプがあります。プロトタイプ自体もオブジェクトであるため、各プロトタイプ自体にもプロトタイプがあります (1 つの例外を除き、デフォルトのオブジェクト プロトタイプはプロトタイプ チェーンの先頭にあります)。

実行コンテキスト
コントローラーが ECMAScript 実行可能コードに切り替わるたびに、コントローラーは実行コンテキストに入ります。


実行コンテキスト (略して EC) は抽象的な概念であり、ECMA-262 標準では、この概念を実行可能コードの概念と区別しています。

標準仕様では、技術実装の観点から EC のタイプと構造を正確に定義していません。これは、ECMAScript エンジンを具体的に実装するときに考慮すべき問題です。

アクティビティ実行コンテキストは論理的にスタックを形成します。スタックの一番下は常にグローバル コンテキストであり、スタックの一番上は現在の (アクティブな) 実行コンテキストです。スタックは、EC のさまざまな種類がプッシュまたはポップされると変更されます。


----------------------------------------------- --- ----------------------------------

状況 1:

js コードを取得して実際に文ごとに実行する前に、ブラウザーは値を割り当てる代わりに変数を宣言するなどの「準備作業」をすでに行っています。変数の代入は、代入ステートメントの実行時に実行されます。

ケース 2:

「準備」フェーズでは、これは直接割り当てられます。

コードをコピーします コードは次のとおりです:
console.log(this) //ウィンドウ



ケース 3:

関数: 関数式と関数宣言

 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) の全説明です。気に入っていただければ幸いです。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート