JavaScriptには、スコープ(スコープ)、スコープチェーン(スコープチェーン)、実行コンテキスト(実行コンテキスト)、アクティブオブジェクト(アクティブオブジェクト)、動的スコープ(動的スコープ)、クロージャー(クロージャー)などの概念が含まれます。これらの概念を理解するために、静的な側面と動的な側面の両方から分析します。
まず、例を作成するために簡単な関数を書きましょう。
コードコピーは次のとおりです。
関数add(num1、num2){
var sum = num1 + num2;
返品額;
}
2つの正式なパラメーターを使用して、追加関数を定義します。
静的な側面:
ADD関数を作成すると、JavaScriptエンジンはADD関数のスコープチェーンを作成し、このスコープチェーンはグローバルコンテキストを指します。グラフィック表現を使用する場合、次の図が示されています。
上記の図からわかるように、ADD関数が作成されると、スコープチェーンが作成されているため、動的な実行期間ではなく、関数が作成されたときに機能のスコープチェーンが作成されるという結論を導き出すことができます。ダイナミックラン中に何が起こるかを見てみましょう。
動的な側面:
ADD関数を実行すると、JavaScriptは実行コンテキストを作成します。これには、ADD関数の実行時に必要なすべての情報が含まれます。実行コンテキストには、独自のスコープチェーンもあります。関数が実行されているとき、JavaScriptエンジンは最初にADD関数のスコープチェーンから実行コンテキストのスコープチェーンを初期化し、JavaScriptエンジンは、関数ランタイム中にすべてのローカル変数、パラメーター、およびこの変数を含むアクティブオブジェクトを作成します。
画像が説明されている場合、ADD関数の動的ランタイム中に起こることは、次の図で説明できます。
上記の図からわかるように、実行コンテキストは動的な概念です。関数が実行されているときに作成されます。同時に、アクティブオブジェクトオブジェクトも動的な概念です。実行コンテキストのスコープチェーンによって参照されます。したがって、実行コンテキストとアクティブオブジェクトの両方が動的概念であり、実行コンテキストのスコープチェーンが関数スコープチェーンによって初期化されると結論付けることができます。
上記は、関数の範囲と実行コンテキストの範囲について説明しています。動的な範囲の問題について話しましょう。 JavaScriptがステートメント、トライキャッチ条項、および評価方法で合格すると、JavaScriptエンジンは実行コンテキストの範囲を動的に変更します。例でそれを見てみましょう:
コードコピーは次のとおりです。
関数initui(){
with(document){//避けてください!
var bd = body、
links = getElementsByTagname( "a")、
i = 0、
len = links.length;
while(i <len){
更新(リンク[i ++]);
}
getElementById( "go-btn")。onclick = function(){
始める();
};
bd.classname = "Active";
}
上記のinitUI関数を実行すると、JavaScriptはステートメントに対応する対応するスコープを動的に作成し、実行コンテキストスコープチェーンのフロントエンドに配置します。上記のプロセスは、下の図を通して鮮明に説明できます。下の赤いマークされた領域は、withステートメントによって生成されたスコープを示しています。
最後に、JavaScriptの最も神秘的な閉鎖を見てみましょう。閉鎖は実際にはJavaScriptの関数です。閉鎖は、関数ランタイム中に作成されます。例を見てみましょう。
コードコピーは次のとおりです。
function assignevents(){
var id = "xdi9592";
document.getElementById( "Save-BTN")。onClick = function(event){
savedocument(id);
};
}
上記のAssignEvents関数が実行されると、閉鎖が作成され、この閉鎖はAssignEventsの範囲のID変数を参照します。従来のプログラミング言語によれば、IDがスタックに保存されている変数である場合。関数が実行されると、IDが消えます。それで、どのように再び参照できますか?明らかに、JavaScriptはここで別の方法を採用しています。 JavaScriptが閉鎖をどのように実装するかを見てみましょう。 AssignEvents関数を実行すると、JavaScriptエンジンはAssignEvents関数の実行コンテキストのスコープチェーンを作成します。このスコープチェーンには、AssignEventsが実行されるときにアクティブオブジェクトが含まれます。同時に、JavaScriptエンジンも閉鎖を作成し、閉鎖のスコープチェーンは、Assigneventsが実行されるときにアクティブオブジェクトを参照します。このようにして、AssignEventsが実行されると、独自の実行コンテキストのスコープチェーンはアクティブオブジェクトを参照しなくなりますが、閉鎖はAssignEventsランタイムに対応するアクティブオブジェクトを指します。次の図を使用して、上記のAssignEvents関数ランタイムの状況を説明できます。
上記からわかるように、AssignEvents関数が実行された後、document.getElementById( "save-btn")。onclickは閉鎖を指します。このようにして、ユーザーがSave-BTNをクリックすると、閉鎖の実行がトリガーされます。閉鎖が実行された状況を見てみましょう。前述のように、JavaScriptの閉鎖は実際には関数であるため、閉鎖の実行と関数の実行の状況は一貫しています。次の図では、上記のオンクリックイベントに関連する閉鎖を鮮明に説明します。
上記の図から、JavaScriptエンジンが最初に閉鎖の実行コンテキストを作成し、次に閉鎖スコープチェーンを使用して閉鎖の実行スコープチェーンを初期化し、最終的に閉鎖がスコープのフロントエンドで実行されるときに対応するアクティブオブジェクトを配置することがわかります。