Javascriptの変数、役割ドメイン、メモリの問題について簡単に説明します.
4763 ワード
【変数】
[1]定義:不定のデータにあだ名を付けることに相当する可変量.変数は情報を格納するコンテナです.[2]プロパティ:jsの変数はばらばらで、任意のタイプのデータを保存できます.特定の時間に特定の値を保存するために使用される名前にすぎません.変数がどのデータ型値を保存する必要があるかを定義するルールが存在しないため、変数の値とそのデータ型はスクリプトのライフサイクル内で変更できます.[3]変数宣言:変数は宣言時に値を割り当てることができるが、+=、-=などの他の操作はできない.
[4]注意:varオペレータで定義された変数は、その変数を定義する役割ドメインのローカル変数になります.varオペレータを省略すると、グローバル変数を作成できますが、厳密モードではReferenceErrorエラーが放出されます.
[5]var:varを使用して宣言された変数は、最も近い環境に自動的に追加されます.変数を初期化するときにvar宣言を使用しない場合、変数は自動的にグローバル環境に追加されます.厳密モードでは、宣言されていない変数を初期化するとエラーが発生します.[6]ローカル変数:ローカル環境に同じ名前の識別子が存在する場合、親環境にある識別子は使用されません.ローカル変数colorの宣言後のコードはwindowを使用しない場合.カラーはグローバルカラー変数にアクセスできません
【識別子】
[1]定義:変数、関数、属性の名前、または関数のパラメータ.[2]注:[2.1]最初の文字は、アルファベット、下線、またはドル記号でなければなりません.その他の文字は、アルファベット、下線、ドル記号または数字[中線が表示されない][2.2]識別子のアルファベットであってもよいし、拡張ASCIIまたはUnicodeアルファベット文字を含んでもよい.
[2.4]キーワード、リザーブワード、true、false、nullを識別子として使用することはできない[2.5]background-colorのような識別子命名規則に合致しない属性については、大きな括弧で書くべきである[backgroundColor][3]識別子解析:識別子解析は、役割ドメインチェーンに沿って1レベルずつ識別子を検索するプロセスである.検索プロセスは、常に役割ドメインチェーンのフロントエンドから開始し、識別子が見つかるまで段階的に遡ります(識別子が見つからない場合は、識別子が宣言されていないことを示し、通常はエラーが発生します).ローカル環境に同じ名前の識別子が存在する場合、親環境の識別子e.g.グローバルおよびローカルに同じ名前の識別子colorは使用されません.ローカル変数colorの宣言後のコードはwindowを使用しない場合は使用しません.colorグローバルcolor変数にアクセスできない[3.2]JavaScriptエンジンは識別子クエリの最適化に優れており、グローバル変数とローカル変数にアクセスする時間の差は無視できる
【役割ドメイン】(実行環境ともいう)
[注意]javascriptにはブロックレベルの役割ドメインはありません[1]実行環境:実行環境は変数または関数がアクセスできる他のデータを定義し、それぞれの動作を決定します.実行環境ごとに変数オブジェクトが関連付けられています.環境で定義されたすべての変数と関数は、このオブジェクトに保存されます.
[2]グローバル実行環境:[2.1]グローバル実行環境は最も周辺の実行環境であり、webブラウザではグローバル実行環境はwindowオブジェクトとされている.そのため、すべてのグローバル変数と関数はwindowオブジェクトの属性と方法として作成されます.グローバル実行環境は、アプリケーションがWebページやブラウザを閉じるなど終了するまで破棄されない[2.2]ページは、グローバル役割ドメインに相当する.ページ内のjsコードであれ、参照された外部jsファイルであれ、最終的にはページ内の前後順に解析されます.
[3]関数実行環境:各関数には独自の実行環境があり、実行フローが1つの関数に入ると、関数の環境は1つの環境スタックに押し込まれ、関数実行後、スタックはその環境をポップアップし、前の実行環境に制御権を返す.
[4]スコープチェーン:コードが1つの環境で実行されると、変数オブジェクトのスコープチェーンが作成されます.役割ドメインチェーンの役割は、実行環境にアクセスできるすべての変数と関数への秩序あるアクセスを保証することです.役割ドメインのフロントエンドは、常に現在実行されているコードが存在する環境の変数オブジェクトです.この環境が関数の場合は、そのアクティブなオブジェクトを変数オブジェクトとします.アクティブなオブジェクトには、最初にargumentsオブジェクト(グローバル環境では存在しない)という変数が1つしか含まれません.役割ドメインチェーンの次の変数オブジェクトは包含環境から、次の変数オブジェクトは次の包含環境から来ます.このようにして、グローバル実行環境まで継続します.グローバル実行環境の変数オブジェクトは、常に役割ドメインチェーンの最後のオブジェクトです.
[4.1]役割ドメインチェーンの特徴:内部環境は役割ドメインチェーンを通じてすべての外部環境にアクセスできるが、外部環境は内部環境の任意の変数と関数にアクセスできない.これらの環境間のつながりは線形で順序がある.各環境は、変数と関数名をクエリーするために、役割ドメインチェーンを上に検索できます.ただし、どの環境も、役割ドメインチェーンを下に検索することによって別の実行環境に入ることはできません.
[5]ドメインチェーンの延長:
[5.1]try-catch文:catchブロックは、投げ出されたエラーオブジェクトの宣言を含む新しい変数オブジェクトを作成します[5.2]with文:指定されたオブジェクトが役割ドメインチェーンに追加されます
【ごみ回収】:javascriptには自動ごみ収集メカニズムがあり、実行環境はコード実行中に使用されるメモリの管理を担当します.
[1]ゴミ回収メカニズム:使用を継続しない変数を特定し、使用するメモリを解放すると、ゴミ収集器は一定の時間間隔、またはコード実行中に所定の収集時間に従って周期的にこの操作を実行する
[2]ゴミ収集フラグの無駄な変数の2つのポリシー
[2.1]タグクリア、タグ「環境に入る」と「環境から離れる」.役割ドメインから離れた値は自動的に回収可能とマークされるため、ゴミ収集中に[2.2]参照カウントが削除され、各値が参照された回数が追跡記録される.1つの変数が宣言され、1つの参照タイプ値が変数に付与されると、その値の参照回数は1であり、同じ値が別の変数に付与されると、その値の参照回数に1が加算され、逆に、この値に対する参照を含む変数が別の値を取得すると、この値の参照回数は1減少し、この値の参照回数が0の場合、この値にアクセスできないことを示します.これにより、使用したメモリ容量を回収できます.[2.2.1]参照カウントの問題:循環参照:オブジェクトAにはオブジェクトBを指すポインタが含まれており、オブジェクトBにもオブジェクトAを指すポインタが含まれている[2..2]IE:IEの一部のオブジェクトは元のjsオブジェクトではなく、例えば、そのBOMとDOMのオブジェクトはc++を使用してCOMオブジェクトの形で実現され、COMオブジェクトのゴミ回収メカニズムは参照カウントポリシーを採用している
解決策:このような循環参照を避けるためには、使用しないときに手動で切断することが望ましい.
myObject.element = null; element.someObject = null;この問題を解決するために、IE 9はBOMとDOMオブジェクトを本物のjsオブジェクトに変換した.
【メモリ管理】
[1]主な問題:Webブラウザに割り当てられる使用可能なメモリの数は、通常、デスクトップアプリケーションに割り当てられるメモリよりも少なく、jsを実行するWebページがシステムメモリをすべて消費してシステムがクラッシュすることを防止することを目的としています.内在的な制限の問題は、変数にメモリを割り当てるだけでなく、呼び出しスタックと1つのスレッドで同時に実行できる文の数にも影響します.
[2]最適化方式:実行中のコードに必要なデータのみを保存する.データが役に立たなくなると、その値をnullに設定することで参照を解放することが望ましい.これを参照解除と呼ぶ.この方法は、ほとんどのグローバル変数とグローバルオブジェクトのプロパティ、およびループ参照変数に適用され、ローカル変数は実行環境から離れると自動的に参照が解除されます.
変数の参照を解除することは、値が消費するメモリを自動的に回収することを意味しません.リファレンスを解除する真の役割は、ゴミ収集器が次回の実行時に回収できるように、実行環境から値を離すことです.
[1]定義:不定のデータにあだ名を付けることに相当する可変量.変数は情報を格納するコンテナです.[2]プロパティ:jsの変数はばらばらで、任意のタイプのデータを保存できます.特定の時間に特定の値を保存するために使用される名前にすぎません.変数がどのデータ型値を保存する必要があるかを定義するルールが存在しないため、変数の値とそのデータ型はスクリプトのライフサイクル内で変更できます.[3]変数宣言:変数は宣言時に値を割り当てることができるが、+=、-=などの他の操作はできない.
var a = 2;//
var a += 2;//
var a = 2++;// ,++ ,
[4]注意:varオペレータで定義された変数は、その変数を定義する役割ドメインのローカル変数になります.varオペレータを省略すると、グローバル変数を作成できますが、厳密モードではReferenceErrorエラーが放出されます.
[5]var:varを使用して宣言された変数は、最も近い環境に自動的に追加されます.変数を初期化するときにvar宣言を使用しない場合、変数は自動的にグローバル環境に追加されます.厳密モードでは、宣言されていない変数を初期化するとエラーが発生します.[6]ローカル変数:ローカル環境に同じ名前の識別子が存在する場合、親環境にある識別子は使用されません.ローカル変数colorの宣言後のコードはwindowを使用しない場合.カラーはグローバルカラー変数にアクセスできません
【識別子】
[1]定義:変数、関数、属性の名前、または関数のパラメータ.[2]注:[2.1]最初の文字は、アルファベット、下線、またはドル記号でなければなりません.その他の文字は、アルファベット、下線、ドル記号または数字[中線が表示されない][2.2]識別子のアルファベットであってもよいし、拡張ASCIIまたはUnicodeアルファベット文字を含んでもよい.
a Array aItems
b Boolean bIsComplete
f FLoat fPrice
fn Function fnHandler
i Integer iItemCount
o Object oDIv1
re RegExp reEmailCheck
s String sUserName
v Variant vAnything
[2.4]キーワード、リザーブワード、true、false、nullを識別子として使用することはできない[2.5]background-colorのような識別子命名規則に合致しない属性については、大きな括弧で書くべきである[backgroundColor][3]識別子解析:識別子解析は、役割ドメインチェーンに沿って1レベルずつ識別子を検索するプロセスである.検索プロセスは、常に役割ドメインチェーンのフロントエンドから開始し、識別子が見つかるまで段階的に遡ります(識別子が見つからない場合は、識別子が宣言されていないことを示し、通常はエラーが発生します).ローカル環境に同じ名前の識別子が存在する場合、親環境の識別子e.g.グローバルおよびローカルに同じ名前の識別子colorは使用されません.ローカル変数colorの宣言後のコードはwindowを使用しない場合は使用しません.colorグローバルcolor変数にアクセスできない[3.2]JavaScriptエンジンは識別子クエリの最適化に優れており、グローバル変数とローカル変数にアクセスする時間の差は無視できる
【役割ドメイン】(実行環境ともいう)
[注意]javascriptにはブロックレベルの役割ドメインはありません[1]実行環境:実行環境は変数または関数がアクセスできる他のデータを定義し、それぞれの動作を決定します.実行環境ごとに変数オブジェクトが関連付けられています.環境で定義されたすべての変数と関数は、このオブジェクトに保存されます.
[2]グローバル実行環境:[2.1]グローバル実行環境は最も周辺の実行環境であり、webブラウザではグローバル実行環境はwindowオブジェクトとされている.そのため、すべてのグローバル変数と関数はwindowオブジェクトの属性と方法として作成されます.グローバル実行環境は、アプリケーションがWebページやブラウザを閉じるなど終了するまで破棄されない[2.2]ページは、グローバル役割ドメインに相当する.ページ内のjsコードであれ、参照された外部jsファイルであれ、最終的にはページ内の前後順に解析されます.
[3]関数実行環境:各関数には独自の実行環境があり、実行フローが1つの関数に入ると、関数の環境は1つの環境スタックに押し込まれ、関数実行後、スタックはその環境をポップアップし、前の実行環境に制御権を返す.
[4]スコープチェーン:コードが1つの環境で実行されると、変数オブジェクトのスコープチェーンが作成されます.役割ドメインチェーンの役割は、実行環境にアクセスできるすべての変数と関数への秩序あるアクセスを保証することです.役割ドメインのフロントエンドは、常に現在実行されているコードが存在する環境の変数オブジェクトです.この環境が関数の場合は、そのアクティブなオブジェクトを変数オブジェクトとします.アクティブなオブジェクトには、最初にargumentsオブジェクト(グローバル環境では存在しない)という変数が1つしか含まれません.役割ドメインチェーンの次の変数オブジェクトは包含環境から、次の変数オブジェクトは次の包含環境から来ます.このようにして、グローバル実行環境まで継続します.グローバル実行環境の変数オブジェクトは、常に役割ドメインチェーンの最後のオブジェクトです.
[4.1]役割ドメインチェーンの特徴:内部環境は役割ドメインチェーンを通じてすべての外部環境にアクセスできるが、外部環境は内部環境の任意の変数と関数にアクセスできない.これらの環境間のつながりは線形で順序がある.各環境は、変数と関数名をクエリーするために、役割ドメインチェーンを上に検索できます.ただし、どの環境も、役割ドメインチェーンを下に検索することによって別の実行環境に入ることはできません.
[5]ドメインチェーンの延長:
[5.1]try-catch文:catchブロックは、投げ出されたエラーオブジェクトの宣言を含む新しい変数オブジェクトを作成します[5.2]with文:指定されたオブジェクトが役割ドメインチェーンに追加されます
function buildUrl(){
var qs = '?debug=true';
with(location){
var url = href + qs;
}
return url;
}
【ごみ回収】:javascriptには自動ごみ収集メカニズムがあり、実行環境はコード実行中に使用されるメモリの管理を担当します.
[1]ゴミ回収メカニズム:使用を継続しない変数を特定し、使用するメモリを解放すると、ゴミ収集器は一定の時間間隔、またはコード実行中に所定の収集時間に従って周期的にこの操作を実行する
[2]ゴミ収集フラグの無駄な変数の2つのポリシー
[2.1]タグクリア、タグ「環境に入る」と「環境から離れる」.役割ドメインから離れた値は自動的に回収可能とマークされるため、ゴミ収集中に[2.2]参照カウントが削除され、各値が参照された回数が追跡記録される.1つの変数が宣言され、1つの参照タイプ値が変数に付与されると、その値の参照回数は1であり、同じ値が別の変数に付与されると、その値の参照回数に1が加算され、逆に、この値に対する参照を含む変数が別の値を取得すると、この値の参照回数は1減少し、この値の参照回数が0の場合、この値にアクセスできないことを示します.これにより、使用したメモリ容量を回収できます.[2.2.1]参照カウントの問題:循環参照:オブジェクトAにはオブジェクトBを指すポインタが含まれており、オブジェクトBにもオブジェクトAを指すポインタが含まれている[2..2]IE:IEの一部のオブジェクトは元のjsオブジェクトではなく、例えば、そのBOMとDOMのオブジェクトはc++を使用してCOMオブジェクトの形で実現され、COMオブジェクトのゴミ回収メカニズムは参照カウントポリシーを採用している
var element = document.getElementById('some_element');
var myObject = new Object();
myObject.element = element;
element.someObject = myObject;
解決策:このような循環参照を避けるためには、使用しないときに手動で切断することが望ましい.
myObject.element = null; element.someObject = null;この問題を解決するために、IE 9はBOMとDOMオブジェクトを本物のjsオブジェクトに変換した.
【メモリ管理】
[1]主な問題:Webブラウザに割り当てられる使用可能なメモリの数は、通常、デスクトップアプリケーションに割り当てられるメモリよりも少なく、jsを実行するWebページがシステムメモリをすべて消費してシステムがクラッシュすることを防止することを目的としています.内在的な制限の問題は、変数にメモリを割り当てるだけでなく、呼び出しスタックと1つのスレッドで同時に実行できる文の数にも影響します.
[2]最適化方式:実行中のコードに必要なデータのみを保存する.データが役に立たなくなると、その値をnullに設定することで参照を解放することが望ましい.これを参照解除と呼ぶ.この方法は、ほとんどのグローバル変数とグローバルオブジェクトのプロパティ、およびループ参照変数に適用され、ローカル変数は実行環境から離れると自動的に参照が解除されます.
変数の参照を解除することは、値が消費するメモリを自動的に回収することを意味しません.リファレンスを解除する真の役割は、ゴミ収集器が次回の実行時に回収できるように、実行環境から値を離すことです.