変数のスコープとメモリ


基本タイプと引用タイプの簡単な紹介
  • 基本タイプ:スタックメモリに格納された簡単なデータセグメント.データサイズが確定し、メモリの空間サイズが割り当てられます.5つの基本的なデータタイプはUdefined、Null、Boolean、Number、Stringがあります.それらは直接値によって保存されていますので、直接にアクセスできます.
  • 参照タイプ:ヒープメモリに格納されているオブジェクトで、変数に実際に保存されているのはポインタで、このポインタは別の位置を指しています.空間の大きさはそれぞれ違っています.状況に応じて開けられます.参照タイプ(オブジェクト、配列、関数など)の値にアクセスする必要がある場合は、まずスタックからそのオブジェクトのアドレスポインタを取得して、メモリから必要なデータを取得します.オブジェクトは属性を動的に作成できます.
  • コピー
  • 基本型の変数をコピーします.両者は互いに影響しません.
     var num1 = 5;
     var num2 = num1; 
     num1 = 2; //num1 = 2; num2 = 5;
    
  • は、参照型の変数をコピーします.コピーしたのは、オブジェクト変数が保存しているアドレスポインタだけですので、2つのオブジェクト変数は互いに影響します.
  • 関数のパラメータは値によってしか伝達できません.基本タイプは中に保存されている基本タイプの値です.オブジェクトが転送されるのはヒープメモリのアドレスです.非引用伝達とは、2つの変数の間の参照は、パラメータの別名として理解されます.
  • 検出タイプ:
    typeofはBoolean、String、Number、Unidefined、Functionを検出できます.nullと引用タイプについては、Objectに一括して返す.instance ofは、参照タイプの具体的な値:x instance of Aray\Object\RegExpなどを検出することができます.Object.prototype.toString.call(x):変数タイプの詳細を正確に判断することができます.
    実行環境とスコープ
  • 作用分域チェーンの底端は常にwindowオブジェクトであり、フロントエンドは常に現在実行されているコードが存在する環境の変数オブジェクトであり、実行環境ごとに作用分域チェーンを上に検索することができます.下に検索することはできません.
  • 作用分域チェーンを延長して使用することができます.with文は、ロールフィールドチェーンの先頭にlocation変数オブジェクトを追加することができます.with(location){var url=href+“?h=1”}ここのhrefとはlocations.href
  • のことです.
  • は、ブロックレベルのスコープがない(括弧で閉じられたコードブロック):初期化変数がvar宣言されていない場合、自動的にグローバル環境に追加されます.
  • ごみの回収
  • タグクリアポリシー:まずメモリ内のすべての変数をマークしてから、現在の環境にある変数と環境にある変数によって参照される変数のマークを削除します.この後もマークされた変数は、環境にアクセスできなくなっているので、クリアするための変数です.ごみ収集器はメモリクリア作業を完了しました.主要思想:使用しない変数にマークを付け、メモリを再回収する
  • は、カウントポリシーを参照します.参照タイプの値が変数に割り当てられている場合、その値の参照回数は1です.同時にこの値が他の変数に割り当てられたら、この値の参照回数は2になります.逆に、この値を含む参照変数が他の値を取得すると、この値の参照回数は1つ減少します.ある値の参照回数が0の場合、ゴミ回収器はこの値を回収して、この値が使われているメモリを解放します.主な考え:すべての値が参照される回数を追跡記録する