実行環境は、変数または関数がアクセスする許可を持ち、それぞれの動作を決定する他のデータを定義します。各実行環境には、それに関連付けられた変数オブジェクトがあります。
グローバルな実行環境は、最も周辺の実行環境です。 JavaScriptの実装が配置されているホスト環境に応じて、実行環境を表すオブジェクトも異なります。 Webブラウザでは、グローバル実行環境はウィンドウオブジェクトと見なされます。したがって、すべてのグローバル変数と関数は、ウィンドウオブジェクトのプロパティと方法として作成されます。
変数オブジェクト:環境で定義されているすべての変数と関数は、このオブジェクトに保存されます。
スコープチェーン:環境でコードが実行されると、可変オブジェクトのスコープチェーンが作成されます。スコープチェーンの目的は、実行環境へのアクセス許可を持つすべての変数と機能に秩序あるアクセスを確保することです。スコープチェーンのフロントエンドは、現在実行されているコードが配置されている環境の常に可変オブジェクトです。
アクティブオブジェクト:アクティブオブジェクトには、最初に1つの変数、つまり引数オブジェクトのみが含まれます。スコープチェーンの次の変数オブジェクトは、包含(外部)環境からのものであり、次の変数オブジェクトは次のインクルージョン環境に由来します。これは、グローバルな実行環境に続きます。グローバル実行環境の変数オブジェクトは、常にスコープチェーンの最後のオブジェクトです。
識別子解析:識別子解析は、スコープチェーンに沿って識別子を1つずつ検索するプロセスです。検索プロセスは常にスコープチェーンのフロントエンドから始まり、識別子が見つかるまで段階的に戻ります。
サンプルコード:
var color = "blue"; function changecolor(){if(color === "blue"){color = "red"; } else {color = "blue"; }} changecolor(); alert( "color is now" + color);関数changeColor()のスコープチェーンには、2つのオブジェクトが含まれています。独自の変数オブジェクト(引数オブジェクトを定義する)とグローバル変数の変数オブジェクトです。変数色は、このスコープチェーンで見つけることができるため、関数内でアクセスできます。
さらに、ローカルスコープで定義された変数は、ローカル環境のグローバル変数と同じ意味で使用できます。例:
var color = "blue"; function changecolor(){var anothercolor = "red";関数swapcolors(){var tempcolor = anothercolor; AnotherColor = color; color = tempcolor; //ここで色、別の色、TempColorにアクセスできます} //ここで色と別の色にアクセスできますが、tempcolor swapcolors();} // ColorChangeColor()にのみアクセスできます。上記のコードには、3つの実行環境が含まれます。グローバル環境、ChangeColor()のハンドル環境、およびSwapColors()のローカル環境です。
グローバル変数には、可変色と関数changeColor()があります。 ChangeColor()のローカル変数には、変数別の色と関数SwapColors()関数が含まれており、グローバル変数の色にアクセスできます。 swapcolors()のローカル変数には変数の温度があります。 SwapColors()では、これらの2つの環境が親実行環境であるため、グローバル変数またはその他のカラー変数の色にアクセスできます。上記の例のスコープチェーンは次のとおりです。
その中で、内部環境はスコープチェーンを介してすべての外部環境にアクセスできますが、外部環境は内部環境の変数や機能にアクセスできません。環境変数間の接続は線形で順番です。各変数は、スペリオンからスコープチェーンを検索することができ、変数と関数名、つまりこの関数の変数または関数名を最初にクエリし、前のスコープチェーンに照会されていない場合は、トップスコープまでクエリがクエリします。ただし、スコープチェーンを検索して別の実行環境を入力する環境はありません。
関数パラメーターは変数としても扱われるため、アクセスルールは実行環境の他の変数と同じです。
1.スコープチェーンを拡張します
スコープチェーンは、実行フローが次のステートメントのいずれかに入ると拡張されます。
•トライキャッチステートメントのブロックをキャッチします
•ステートメント付き
これらの2つのステートメントは、スコープのフロントエンドに変数オブジェクトを追加します。
withステートメントの場合、指定された変数がスコープチェーンに追加されます。 Catchステートメントの場合、スローされる間違ったオブジェクトの宣言を含む新しい変数オブジェクトが作成されます。
例えば:
function buildurl(){var qs = "?debug = true"; with(location){var url = href + qs; } return url;}withステートメントはロケーションオブジェクトを受信するため、その可変オブジェクトにはロケーションオブジェクトで使用されるプロパティとメソッドが含まれており、この可変オブジェクトはスコープチェーンのフロントエンドに追加されます。 withステートメント(実際にはlocation.hrefを参照)の変数HREFを参照する場合、現在の環境変数にあります。変数QSを参照する場合、burturl()で定義された変数が参照されます。これは、関数環境変数オブジェクトにあります。 withステートメントに関しては、urlという名前の変数が定義されているため、URLは関数実行環境の一部になり、関数の値として返すことができます。
2.ブロックレベルのスコープなし
JavaScriptでは、囲まれた巻き毛のブレースには独自の範囲がありません。次のコードを見てください。
if(true){var color = "blue";} alert(color); // "青"JavaScriptでは、if/for Statementが作成した変数宣言は、現在の実行環境に変数を追加します。例えば:
for(var i = 0; i <10; i ++){dosomething(i);} alert(i); // 10ゴミリサイクル
Javaと同様に、JavaScriptには自動ゴミリサイクルメカニズムもあります。実行環境は、コード実行中に使用されるメモリを管理する責任があります。プログラムを作成する場合、関連するメモリ使用の問題は必要ありません。必要なメモリの割り当てと役に立たないメモリのリサイクルが完全に実装されています。ガベージコレクションメカニズムの原則は、使用されなくなった変数を見つけてから、それが占めるメモリを解放することです。これを行うために、Garbage Collectorは、固定時間間隔(またはコード実行中の所定の収集時間)で定期的にこの操作を実行します。
ガベージコレクションを実行する前に、リソースが役に立たないかどうかを判断し、将来メモリをリサイクルするために使用されなくなった変数をマークする必要があります。通常、役に立たない変数を特定するための戦略の実装が2つあります。
1マーククリア
JavaScriptのゴミコレクションの最も一般的な方法は、マーカークリーニングです。変数が環境に入ると、「環境に入る」とマークされます。変数が環境を離れると、「環境を終了する」とマークされます。ゴミコレクターが実行されると、使用されるすべての変数がマークされます。次に、環境内の変数のタグと、環境の変数によって参照される変数を削除します。その後、タグ付き変数は、削除する準備ができた変数と見なされます。最後に、ゴミコレクターはメモリクリアの作業を完了し、マークされた値を破壊し、占有するメモリ空間をリサイクルします。
2。参照カウント
参照カウントとは、各値が参照される回数を指します。変数が宣言され、参照型値が変数に割り当てられている場合、この値への参照数は1です。同じ値が別の変数に割り当てられている場合、値への参照数は1だけ増加します。メモリスペースを取り戻すことができます。次にゴミコレクターが実行されると、参照がゼロでこれらの値で占められているメモリをリサイクルします。
参照カウントを参照する1つの問題は、リサイクルされた参照を引き起こす可能性があります。例えば:
関数問題(){var obja = new object(); var objb = new object(); obja.someTherobj = objb; objb.someTherobj = obja;}上記の例では、OBJAとOBJBは属性を介して互いに参照します。関数の実行が完了した後、OBJAとOBJBは引き続き存在し、参照カウントは0になりません。この状況は、OBJAとOBJBが占有するメモリをリサイクルします。
上記の記事では、JavaScriptについて簡単に説明しています。実行環境、スコープ、ガベージコレクションは、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。