JSの解析メカニズム(役割ドメイン,変数昇格など)と2つの例

1838 ワード

本文はJS解析メカニズムに関するいくつかの問題をまとめた.
まずJS解析メカニズムにおける変数昇格の概念を説明する:変数昇格は変数宣言をその役割ドメインの最初の部分に昇格させるが、変数をundefinedと宣言するだけで、正式にプログラムを実行するときに後続の付与式を実行する.
次のプログラムを見てみましょう.
(function(){
    a = 5;
    alert(window.a);
    var a = 10;
    alert(a);
})();

実行結果はundefined 10
ここで、jsにvarキーを持たない変数は、varで宣言されていない変数であり、jsは自動的にグローバル変数としてグローバル役割ドメイン内で暗黙的な宣言を行います.
したがって、プログラムは、以下の順序で実行されると理解される.
var a = undefined;  
//       a=5   var,JS                    window.a = undefined(         window  )
(function(){
    var a = undefined;  //     var a=10                   (      )   ,  a              
    a = 5;      //    a        ,           a   5      window.a    undefined
    alert(window.a);     //undefined
    a = 10;       //     a   10  
    alert(a);     //10
})();

別のプログラムを見てみましょう.
alert(a)   
var a = 1;
alert(a)   
function a(){alert(1)};
alert(a)   
var a = 2;
alert(a)   
function a(){alert(2)};
alert(a)  

a()

上のプログラムの実行結果は何ですか?
まず、関数の昇格の概念について説明します.関数の宣言も役割ドメインの一番上に昇格しますが、完全な関数として直接宣言され、その後、プログラムを行ごとに実行するときは宣言されません.
1つの注意すべき点は、varとfunctionが同じ変数(例えば、上記の同じ名前のa)を宣言している場合、varはfunctionの宣言を上書きせず、functionはvarの宣言を上書きすることができる.
プログラムは以下の形式で理解できる.
var a = undefined;	   // a=undefined
function a(){alert(1)};    // a=function(){alert(1)}
var a = undefined;   	   //            a=function(){alert(1)}
function a(){alert(2)};    // a=function(){alert(2)}
alert(a)                   // function(){alert(2)}
a = 1;  		   //   a=1        a=1
alert(a)   		   // 1
function a(){alert(1)};    //            a  =1
alert(a)   		   // 1
a = 2; 			   //       a=2
alert(a)   		   // 2
function a(){alert(2)};    //            a  =2
alert(a)   		   // 2

a()                        //   a=2          3()       a is not a function