js的執行上下文

2022-08-26 03:18:09 字數 2926 閱讀 8344

js的執行環境有三種:

1. 全域性環境

2. 函式內環境

3. eval環境

execute context:  執行上下文。

1)全域性執行上下文

js引擎遇到可執行的js**,預設建立乙個全域性執行上下文。

2)函式執行上下文

js引擎遇到函式呼叫,會立即建立乙個函式執行上下文。

執行上下文週期:

執行上下文週期分為兩個階段:

建立階段的任務有三個:

1. 生成變數物件(vo)

2. 建立作用域鏈scope

3. 宣告this指向

this在建立階段只是宣告,在執行階段根據函式執行時所在的執行上下文確定this指向的上下文的變數物件vo。

當函式執行內部**時,進入執行階段。

variable object: 變數物件,建立階段的變數物件。

active object: 啟用後的變數物件,即執行上下文執行階段的vo。

global object: 全域性物件,全域性執行上下文對應的變數物件(ao/vo)。

每個執行上下文物件都有乙個變數物件的屬性,它用於存放執行上下文週期的建立階段的形式引數、函式宣告和變數宣告。不能被使用者直接訪問。

在執行上下文週期的執行階段,vo中對應的屬性被賦值,變為ao,ao中內容是變數查詢的內容。

變數物件的建立順序如下:

function

a(x,y)

a(1); //1/*

acontext:

}*/

遍歷函式宣告,將其函式名稱作為ao的屬性,它會覆蓋同名的屬性。

function

a(x,y)

console.log(x);

}a(1); //

function x(){}

/*acontext:

}*/

查詢遍歷宣告內容,將其變數名作為ao的屬性。

1. 如果ao中已經有同名的屬性,則該變數宣告忽略。

function

a(x,y)

varx;

console.log(x);

}a(1); // function x(){}

/*acontext:

}*/

2. 如果有同名屬性,但是如果查詢階段賦值,會覆蓋前面同名屬性和對應的值。

function

a(x,y)

var x=2;

console.log(x);

}a(1); // 2

/*acontext:

}*/

3. 如果ao中已經後同名的形式引數,變數宣告也會被忽略。

function

a(x,y)

a(1); //1/*

acontext:

}*/

function

a()

}}

函式宣告時就會產生乙個作用域,位於函式的[[scope]]屬性上,指向其所有的父執行上下文的變數物件vo。

a[[scope]] = [//

父作用域

globalcontext.vo

]b[[scope]] =[

acontext.vo,

globalcontext.vo

]c[[scope]] =[

bcontext.vo,

acontext.vo,

globalcontext.vo

]

而執行上下文的scope屬性,指向當前作用的完整的作用域鏈。即函式的[[scope]]屬性加上當前作用域的ao物件。

//

例如:ccontext =,

},scope: [ao, ..c[[scope]]]

}

**執行後,查詢變數會根據執行上下文的作用域鏈開始查詢,即從當前函式執行上下文的ao物件開始查詢,查詢不到則到上層的變數物件查詢,依次查詢,直到查詢到全域性執行上下文的變數物件為止。

execute context stack: 執行上下文棧,也稱為函式呼叫棧。

用於儲存管理所有的執行上下文物件。

示例:

function

foo(i)

foo(i+1);

console.log(i);

} foo(0);

// 執行結果21

0

js引擎遇到可執行**,預設生成全域性上下文。即位於棧底。

ecs = [globalcontext];

遇到函式呼叫,將函式入棧。

ecs.push(foo0context);

ecs.push(foo1

context);

ecs.push(foo2

context);

ecs.push(foo3context);

其棧結構如下:

|------------------|

|foo(3);console(2);|

|------------------|

|foo(2);console(1);|

|------------------|

|foo(1);console(0);|

|------------------|

|foo(0); |

|------------------|

|globalcontext |

|------------------|

函式執行完成後,一一出棧。最後的全域性上下文在瀏覽器關閉的時候才會銷毀。

ecs.pop();

js執行上下文與執行上下文棧

在了解js的執行上下文物件與執行上下文棧之前,我們要先了解兩個概念 即變數提公升跟函式提公升 變數提公升 通過var定義的變數,在定義語句之前我們就可以直接訪問到,不過它的值是undefined 函式提公升 通過function定義的函式,在函式定義語句前,我們就可以直接呼叫 變數提公升與函式提公升...

JS執行上下文

執行上下文,即context,也不知道是誰翻譯的,不少的文獻 書籍用的都是這個詞。還記得第一次接觸這個詞時的惆悵 迷惘 不知所措,扶了扶眼鏡,翻開大辭典,還是翻譯成環境比較接地氣。js執行上下文,即js的執行環境。當我們的 執行時,會進入到不同的執行上下文,即不同的環境。在不同的環境中,有著不同的 ...

JS的執行上下文

執行上下文時是 執行時的環境,js 在執行前進行編譯,那麼會生成兩部分,一部分是可執行的 而另一部分則是執行上下文。用於跟蹤 執行的運 況。執行步驟如下 全域性執行上下文 函式執行上下文和 eval 執行上下文 執行上下文所包含的內容是在不斷的變化的。它主要分為了三個不同的階段。分別是es3階段,e...