JS預編譯 函式預編譯和全域性預編譯

2021-10-02 09:21:00 字數 3967 閱讀 4815

預編譯發生在函式執行前一步

建立ao物件(執行期上下文)

找形參和變數宣告,將變數和形參名作為ao 屬性名,值為undefined

將實參值和形參統一

在函式體裡面找函式宣告,值賦予函式體

結果:

預編譯過程:(函式馬上要執行,但是還沒執行)

首先建立ao物件,也就是函式它產生的儲存空間庫

ao,b:undefined,

d:function d() {}

1    function fn(a) 

6        console.log(a);

7        var b = function(){}

8        console.log(b);

9        function d() {}

10   }

11    fn(1);

那麼首先要執行第2行**也就是訪問ao中的a 所以列印出-:function a() {}然後執行第3行 也就是 var a = 123;但是應該執行a=123;因為在預編譯的第一步變數a被提前了所以此時列印結果為:123

然後再執行第5行  function a() {} 因為已經提前執行了,所以此處省略,所以第6行列印的結果為:

123

當執行到第7行時原來的undefined變為 function

ao,

b:function(){},

d:function d() {}

}

所以列印結果為:

function(){}

1 function test(a,b) 

9 function d() {}

10 console.log(b);

11 }

12 test(1);

ao建立的過程:ao實參形參統一:ao

找函式體:

ao,

c:undefined,

d:function d(){}

}

然後函式執行:

ao

}

所以結果為:

function test(a,b) //函式宣告

var a ;

b = 234;

var b = function() {} // 函式表示式

console.log(a);

console.log(b);

}test(1);

執行結果

如圖:如果直接在全域性呼叫a變數會出現undefined

但是如果**改為:

則結果如上圖;

從而引出全域性編譯過

生成乙個go物件,global object,即window物件

找形參和變數宣告,將變數和形參名作為go屬性名,值為undefined

在函式體裡面找函式宣告,值賦予函式體

上圖的編譯模型如下:

go }

test(1);

var test = 123;go

aoao

fn();go

goao

fn();

var global;

//先找宣告語句var global; 那麼此時global:undefined;

go//然後執行global=100

go//然後函式開始執行執行:雖然沒有形參,但它有自己的global

aoao

ao

function test() 

c=234;

}var a;

test();

a=10;

console.log(c);

//先找宣告語句var a; 那麼此時a:undefined;

go//然後執行test();由於沒有形參和內部函式宣告則直接找變數宣告

ao

go

var foo =11;

}console.log(bar());列印結果:

function foo()

console.log(bar());

function bar()

var foo = 11;

return foo;

}

列印結果:11

a=100;

function demo(e)

arguments[0] =2;

console.log(e);

if(a)

}var c;

a=10;

var a;

console.log(b);

f=123;

console.log(c);

console.log(a);

}var a;

demo(1);

console.log(a);

console.log(f);

go}go

}//demo執行

ao//形參實參統一

ao//在函式體裡面找函式宣告,值賦予函式體

ao,b:undefined,

c:undefined,

a:undefined

}//形式實參相對映

ao//由於a = undefined 所以var b = 123; function c() {} 不執行

ao//當執行到 f=123; 時將f 付給windo物件即

go,f:123

}

結果:

undefined

undefined

JS 函式預編譯

1 語法分析 2 預編譯 3 解釋執行 預編譯四部曲 1.函式在執行的瞬間,生成乙個執行期上下文 active object 簡稱ao 2.分析引數 2.1 函式接收形式引數,新增到ao的屬性,並且這個時候值為undefine,例如ao.age undefined 2.2 接收實參,新增到ao的屬性...

函式預編譯

函式預編譯 函式預編譯的步驟 1 語法分析 2 預編譯 3 解釋執行 當函式執行時,會建立乙個稱為執行期上下文的內部物件 go和ao 乙個執行期上下文定義了乙個函式執行時的環境,函式每次執行時對應的執行上下文都是獨一無二的,所以多次呼叫乙個函式會導致多個執行上下文,當函式執行完畢,它所產生的執行上下...

js的預編譯

預編譯發生在函式執行前一刻 預編譯執行的步驟 1建立執行期上下文,activation object 即ao 2找形參和變數宣告,將形參和變數宣告做為ao的屬性名,尚未賦值,值為 undefined 3將形參和實參相統一,即把實參的值傳到形參裡面去 4在函式體裡面找函式宣告,賦值函式體 functi...