javascriptはモデルのいくつかのテストを実行します.


一jsのスキャン過程
    jsはコードを実行する前に、定義された変数名と関数オブジェクトを取得するためのスキャン(プリコンパイルに相当)のプロセスがあります.主に以下のいくつかの処理ステップを含む.
  • が「var instance=xxx」という語句に遭遇した場合、現在のvariable Objectにこの属性を追加し、undefined
  • を付与する.
  • が関数の定義「function func(){}」に触れた場合、この関数を用いて該当する関数オブジェクトを作成し、varable objectオブジェクトにこの属性funcを追加し、その値は戻りの関数オブジェクトである.
  •     この過程を例に挙げて分析します.
    // a
    var local_v = "local v";
    global_v = "global v";
    
    alert(local_v);    // 1
    alert(global_v); // 2     
      
    
    // b
    function func1(){
          alert(local_v);
    }
    
    var func2 = function(){
          alert(local_v);
    }
    
    func1();  //3
    func2();  //4
    
    
    上記のコードの実行過程は以下の通りです.
  • Global Objectすなわちwindowオブジェクトを初期化し、Varable Objectはwindowオブジェクト自体である.
  • ソースコードをスキャンし、windowオブジェクトにlocal_を追加しました.vとfunc 2属性、値はすべてundefinedです.func 1属性を追加しました.値はこの定義で返された関数オブジェクトです.
  • ソースコードを実行し、local_を実行します.v属性の値は「local v」で、global objectオブジェクトに属性を付けます.  global_vは「global v」として割り当てられます.
  • は正確にlocal_をプリントアウトしました.v  とglobal_vの値
  • は、匿名関数オブジェクトを作成し、その値を「func 2」属性に割り当てる.
  • は、func 1()関数を実行し、local_を印刷します.v属性の値
  • は、func 2()関数を実行し、local_を印刷します.v属性の値
  •      この分析に基づいて、上記のコードの中の1、2をaの上に移動します.3、4をbの上に移動して、もう一度実行します.このとき、第1条の文は「undefined」を印刷し、第2条の文を実行すると「global v is not defined」をエラーとします.これはwindowの対象にもうlocalがあるからです.v属性は、表示されていません.そしてglobal_v属性はまだ存在しません.同じ道理で、第3条の文は結果を正確に出力しました.第4条語句は「func 2 is not a function」と間違えます.このとき、関数オブジェクトとしてfunc 1が割り当てられています.func 2はないです.
         jsのこの実行モデルを理解すれば、いくつかの紛らわしい問題を正確に答えられます.
    var x='global';
    document.writeln(x);   // 1
    func();
    
    function func(){
        var x='func';
        function inner(){
           document.writeln(x);   // 2
           var x='inner';
           document.writeln(x);  // 3
        }
        inner();
        document.writeln(x);  // 4
    } 
     
    以上のように、実行モデルがよく分からないと、第2条の文は「func」または「inner」を出力すると考えられてしまうかもしれません.
    正しい出力結果は、  global    undefined    inner   func第2条ステートメントを実行する前に、inner関数内のvariable ojectでscope chain上のfunc関数内の属性値を新しいx属性値で置換しました.新しい値はこの文にはまだ値が与えられていませんので、印刷された結果は「undefined」です.