1. 程式人生 > >js的預解析

js的預解析

預解析:js解析器載入時,會首先檢查語法錯誤,後進行變數宣告提升和函式體宣告提升,解釋一行語句執行一行語句

1.檢查語法錯誤

2.變數宣告提升和函式體整體提升(變數提升時只提升變數名)

函式體中也有變數宣告提升和函式體宣告提升

console.log(a);     //列印為undefined,var a;宣告提升
   var a = 100;
   console.log(a);   //列印為100
fn();
function fn(){
console.log(b);   //列印為undefined
var  b = 20;
console.log(b); //列印為20}

console.log(c);     //列印為undefined
   var c = 100;
   console.log(c);   //列印為100
function fn(){
console.log(c);   //列印為100
}
fn();
console.log(c);     //列印為undefined
   var c = 100;
   console.log(c);   //列印為100
function fn(){
console.log(c);   //列印為undefined;自己函式體類的變數宣告提升
    var c = 20;        
console.log(c);   //列印為20,自己函式體內有變數c,就近原則,使用自己函式體內的變數
}
fn();

console.log(d);     //列印為undefined
   var d = 100;
   console.log(d);   //列印為100
function fn(){
console.log(d);   //列印為100
     d = 20;        //定義的為隱式全域性變數
console.log(d);   //列印為20
}
fn();

console.log(a);     //列印為undefined
   var a = 100;
   console.log(a);   //列印為100
function fn(){
console.log(a);   
     a = 20;        //定義的為隱式全域性變數
console.log(a);   
}
console.log(a);  //列印為100
fn();    //在執行該語句時列印首先列印的是100(隱式變數宣告未提升,首先該語句執行時之前沒有找變數就從全域性找)和
         //20(從自己的中找到個隱式全域性變數d,所以列印為20)
console.log(a) //列印為20(函式數體中的隱式全域性變數覆蓋了外部的變數)

console.log(a);     //列印為undefined
   var a = 100;
   console.log(a);   //列印為100
fn();    //在執行該語句時列印首先列印的是100(隱式變數宣告未提升,首先該語句執行時之前沒有找變數就從全域性找)和
         //20(從自己的中找到個隱式全域性變數d,所以列印為20)
console.log(a); // 列印20,被100值被覆蓋function fn(){console.log(a); a = 20; //定義的為隱式全域性變數console.log(a); }console.log(a); //列印為20


重要的是知道原理,不論在怎麼變都能夠明白