什麼是執行上下文
執行上下文型別
全域性執行上下文:
建立階段:
建立乙個全域性執行上下文環境:
建立函式執行上下文環境:當函式被呼叫,但未執行任何其內部**之前,會做以下三件事
執行階段:執行變數賦值、**執行。
**階段:執行上下文出棧等待虛擬機器**執行上下文。
變數宣告提公升:建立上下文執行環境時,js會預解析變數、函式,因此在執行階段時,就會產生變數宣告提公升的現象。
console.
log(a)
;// undefined
var a =
10;
函式宣告提公升:js預解析函式產生的現象。
建立乙個函式的方法有兩種:
//例1.函式宣告,預解析出來的是函式
sayhi()
;//不會報錯
function
sayhi()
//例2.函式表示式,預解析出來的是undefined,因為被當成變數
sayhi()
;//報錯,因為sayhi不是函式
varsayhi
=function()
函式、變數同名的情況,函式提公升優先順序比變數提公升要高,且不會被變數宣告覆蓋,但是會被變數賦值覆蓋。
//例1:
var a =4;
functiona(
)console.
log(a)
//得到4,說明函式宣告會被變數賦值覆蓋。
//例2:
functiona(
)var a;
console.
log(a)
//得:function a();說明函式宣告不會被變數宣告覆蓋。
幾個關鍵點:
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-qep60flx-1614484712532)(/users/mr.jiang/desktop/我的學習腦圖/typora相關/前端/執行上下文1.gif)]
執行棧案例:
function
fun1()
function
fun2()
function
fun3()
fun1()
;// 最後列印3
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-x6kb0hqf-1614484712533)(/users/mr.jiang/desktop/我的學習腦圖/typora相關/前端/執行上下文2.jpg)]
上述**執行按照如下步驟:
變數物件跟活動物件的區別
全域性變數物件(全域性執行上下文建立階段建立的物件)
函式變數物件(函式執行上下文建立階段建立的物件)
函式上下文的變數物件初始化只包括 arguments 物件;
在進入執行上下文時會給變數物件新增形參、函式宣告、變數宣告等初始的屬性值(js預解析階段);
在**執行階段,會再次修改變數物件的屬性值;
js執行上下文與執行上下文棧
在了解js的執行上下文物件與執行上下文棧之前,我們要先了解兩個概念 即變數提公升跟函式提公升 變數提公升 通過var定義的變數,在定義語句之前我們就可以直接訪問到,不過它的值是undefined 函式提公升 通過function定義的函式,在函式定義語句前,我們就可以直接呼叫 變數提公升與函式提公升...
JS執行上下文
執行上下文,即context,也不知道是誰翻譯的,不少的文獻 書籍用的都是這個詞。還記得第一次接觸這個詞時的惆悵 迷惘 不知所措,扶了扶眼鏡,翻開大辭典,還是翻譯成環境比較接地氣。js執行上下文,即js的執行環境。當我們的 執行時,會進入到不同的執行上下文,即不同的環境。在不同的環境中,有著不同的 ...
JS高階(6) 執行上下文與執行上下文棧
一 變數提公升和函式提公升 變數宣告提公升 函式宣告提公升 面試題 輸出 undefined undefined 變數提公升 fn2 可呼叫 函式提公升 fn3 不能 變數提公升 二 執行上下文 分類 根據位置分 全域性執行上下文 開始執行全域性 函式執行上下文 開始執行函式體 三 執行上下文棧 在...