JS解析メカニズム——前解析
3205 ワード
先に事前解析の感想を言います.現在の作用領域では、jsは実行前に事前解析を行います.事前解析はvarとfunctionを含むキーワードを声明し、メモリの中に準備して、事前解析をしてからコードを読み取ります.
例1:
例二:
注:関数はどこで声明しても一番前に上げられます.つまり、jsコードが実行される前に、解析器は関数を事前に宣言して、コードを実行しているので、関数全体を出力します.
例1:
// An highlighted block
console.log(a) //undefined
var a = 1;
説明:事前解析してvar定義の変数aを見つけて、aをundefinedに割り当てて、1行ずつコードを読み込む時、consolone.logは前にあります.この時のa値はundefinedです.だから、印刷したのはundefinedです.そしてaは1に割り当てられます.例二:
// An highlighted block
var a = 1;
function fn(){
console.log(a); //undefined
var a = 3;
}
fn();
説明:事前解析はグローバル変数を解析してから、グローバル変数varで定義されたaはundefinedに割り当てられ、その後、ローカル変数の中でvarで定義されたaはundefinedに割り当てられ、次にコードを逐行読み取り、グローバル変数のaは1で補助され、ローカル変数consolie.logプリントaは、この時のaはundefinedである.その後、aは3つの値を割り当てられます.したがって、印刷結果はundefined.例3:// An highlighted block
var a = 1;
function fn(){
console.log(a); //1
a = 3;
}
fn();
説明:局部作用領域の事前解析では、a=3はvarで定義されていないので、グローバル変数であり、事前解析されないので、aが見つからないです.作用ドメインチェーンの規則により、a=1を探しています.だから、consolie.log(a)は1に印刷されます.注:関数はどこで声明しても一番前に上げられます.つまり、jsコードが実行される前に、解析器は関数を事前に宣言して、コードを実行しているので、関数全体を出力します.