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中內容是變數查詢的內容。
變數物件的建立順序如下:
functiona(x,y)
a(1); //1/*
acontext:
}*/
遍歷函式宣告,將其函式名稱作為ao的屬性,它會覆蓋同名的屬性。
functiona(x,y)
console.log(x);
}a(1); //
function x(){}
/*acontext:
}*/
查詢遍歷宣告內容,將其變數名作為ao的屬性。
1. 如果ao中已經有同名的屬性,則該變數宣告忽略。
functiona(x,y)
varx;
console.log(x);
}a(1); // function x(){}
/*acontext:
}*/
2. 如果有同名屬性,但是如果查詢階段賦值,會覆蓋前面同名屬性和對應的值。
functiona(x,y)
var x=2;
console.log(x);
}a(1); // 2
/*acontext:
}*/
3. 如果ao中已經後同名的形式引數,變數宣告也會被忽略。
functiona(x,y)
a(1); //1/*
acontext:
}*/
functiona()
}}
函式宣告時就會產生乙個作用域,位於函式的[[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: 執行上下文棧,也稱為函式呼叫棧。
用於儲存管理所有的執行上下文物件。
示例:
functionfoo(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...