JS解析と実行過程

1648 ワード

問題
他のプログラミング言語では、先に声明してから使用しなければならないと規定されています.
var a = 10;  //   
alert(a);  //   
しかし、JSでは、次のように発見されました.
alert(a);  //     
fn();   //   fn  

var a = 10;  //   
function fn(){}
なぜ先に後の声明を使ってもいいですか?
     JS           **   **
カテゴリ
JS解析と実行過程は2つの部分に分かれています.
1、   (JS           )
2、   (            )
全体
グローバルJSコードの実行は2段階(JSは最初から次の2段階)に分けられます.
1.      
2.     
前処理は主に以下の2つのコードを処理します.
1、        
2、     var     
######################     

alert(a);  //undefined
fn();
alert(b);  //  ,b        

var a = 10;
b = 123;
function fn(){}


######################     

function fn(){}
var a;

alert(a);  //undefined
fn();
alert(b);  //  ,b        

a = 10;
b = 123;
上から見れば、なぜJSが声明の前に呼び出されたのか、もう一つ重要なことは、前処理の処理手順:先に関数を処理してからvar変数を処理することです.
関数
関数体内のJSコードの実行は、2段階(関数コールの場合は、以下の2段階)に分けられます.
1.      
2.     
前処理は主に以下の3つのコードを処理します.
1、    
2、        
3、     var     
関数内の前処理の手順:まず関数パラメータを処理して、関数に行って、最後にvar変数を処理します.
######################     

function go(a, b){
    alert(a)
    test();
    
    var aa = 10;
    function test(){}
}
go(1, true)

######################     

function go(a, b){
    function test(){}
    var aa;    
    
    alert(aa)  // undefined
    alert(a)   // 1
    test();
    
    aa = 10;
}
go(1, true)
名前の衝突
  • 、1つのvar変数名が1つの関数名と同じであれば、関数優先
  • もし1つのvar変数名が他のvar変数名と同じであれば、最初を基準とする
  • 関数内のパラメータ名が関数名と同じであれば、関数として好ましい
  • 関数内のパラメータ名が1つのvar変数と同じ名前であれば、パラメータが最初ですので、パラメータ優先