? 一.執行上下文的概念:
? ? ?執行上下文簡稱上下文。變量或者函數的上下文決定了它們可以訪問哪些數據,以及它們的行為。每一個上下文都具有一個關聯的變量對象,而這個上下文中定義的所有變量和函數都存在于這個對象上。
? ?二.JS中上下文的執行機制:
? ? ? ? 全局上下文是最外層的上下文。根據ECMAScript實現的宿主環境,表示全局上下文的對象可能不一樣。在瀏覽器中,window對象一般就是我們所說的全局上下文,因此所有通過var定義的全局變量都會綁定在window對象上,但是使用let和const定義的變量則不會定義在全局上下文中。執行上下文是JS代碼在執行時的環境抽象,它包括了變量對象,作用域鏈,this指向等信息。
? ? ? ? 每個函數流都有自己的上下文。當代碼執行流進入函數時,函數的上下文被推到一個上下文棧上。在函數執行完畢之后,上下文棧就會彈出該函數的上下文,把控制權交還給之前的執行上下文。JS中程序的執行流就是通過這個上下文棧進行控制的。
? ? ? ? 上下文在其所有代碼都執行完畢后會被銷毀,包括定義在其上面的所有變量和函數,而全局上下文則會在應用程序退出前才會被銷毀,比如關閉網頁或者是退出瀏覽器。
? ? 三.JS中上下文的生命周期:
? ? ? ? 執行上下文的生命周期包括兩個階段:創建階段和執行階段。
? ? ? ? 3.1創建階段:
? ? ? ? ? ? ?首先會根據上下文的類型來創建一個空的變量對象,然后建立作用域鏈,作用域鏈是一個指向父級作用域的鏈表,用于查找變量的值;在全局上下文中,this的指向為全局對象。在函數內部,this的指向取決于函數的調用方式;然后將函數的參數,函數的聲明和變量添加到變量對象中。
? ? ? ? 3.2執行階段:
? ? ? ? ? ? ?在執行階段會按照如下步驟來進行:按照代碼的順序執行,對變量進行賦值等操作;然后通過作用域來查找變量的值,最后在函數上下文中執行函數體內的代碼。
四.上下文的分類:
? ? ?4.1全局上下文:
? ? ? ? ? ?全局上下文是默認的,最外層的上下文。它存在于整個頁面生命周期,負責全局變量的聲明和函數的執行。
? ? ? 4.2函數執行上下文:
? ? ? ? ? ?每當調用一個函數時,都會創建一個新的函數執行上下文。函數執行上下文在函數執行結束后被銷毀。
? ? ? ?4.3Eval執行上下文:
? ? ? ? ? ? eval函數執行的代碼會在一個新的執行上下文中運行,被稱為eval執行上下文。
五.JS上下文中的作用域鏈:
var color="blue";function changeColor(){if(color==="blue"){color="red";}else{color="blue"}}changeColor();
就這個例子而言,函數changeColor()的作用域鏈包括兩個對象,一個是它自己的變量對象,一個就是全局上下文的變量對象。在這個函數內部之所以能夠訪問變量color,就是因為可以在作用域中找到這個變量。
var color="blue";function changeColor(){let antherColor="red";function swapColor(){let tempColor=antherColor;anthorColor=color;color=tempColor;//可以訪問到color,antherColor和tempColor}//可以訪問到color,antherColor,訪問不到tempColorswapColor();}changeColor()//只能訪問到color;
在面的例子中,設計三個上下文,全局上下文,changeColor()的局部上下文和swapColor()的局部上下文。在全局上下文中只有一個變量color和一個函數changeColor()。changeColor()的局部上下文中包括一個變量antherColor和一個函數swapColor()?.但是在changeColor()中可以訪問到全局上下文中的變量color。swapColor()的局部上下文中有一個變量tempColor,只能在這個上下文中訪問到。在全局上下文和changeColor()的局部上下文中都無法訪問到變量tempColor。但是在swapColor()中則可以訪問另外兩個上下文中的變量,因為它們都輸父上下文。
? ? ? ? 所以,內部上下文可以通過作用域鏈訪問外部上下文中的一切,但是外部上下文無法訪問內部上下文中的任何東西。因為在上下文中的連接是線性的,有序的。每個上下文都可以到上一級山下文中去搜索變量和函數,但是任何上下文都不能去下一級的上下文中去搜索。內部上下文首先從自己的變量對象開始搜索變量和函數,搜索不到就去搜索上一級變量對象。
?
????????
? ? ? ?