###執行背景關系 - 先進后出,后進先出。 #####函式的執行背景關系的生命周期 執行背景關系的生命周期分為兩個階段: 1. 創建階段(進入執行背景關系):函式被呼叫時,進入函式環境,為其創建一個函式背景關系 2. 執行階段(代碼執行):執行函式中代碼時,此時執行背景關系進入執行狀態。 #####創建階段的操作 1. 創建變數物件 - 函式環境會初始化創建 Arguments 物件,形式引數(并賦值)。 - 普通函式宣告(并賦值) - 區域變數宣告,函式運算式宣告(未賦值) 2. 初始化作用域鏈 3. 確定this指向(this由呼叫者確定) 4. 確定作用域(詞法環境決定,哪里宣告定義,就在哪里確定) #####執行階段的操作 1. 變數物件賦值 - 變數賦值 - 函式運算式賦值 2. 呼叫函式 3. 按順序執行其他代碼 #####執行背景關系與作用域區別 作用域和執行背景關系不是同一個概念。 執行全域代碼時,會產生一個執行背景關系環境,每次呼叫函式都會執行背景關系環境。當函式呼叫完時,這個背景關系環境以及其中的資料都會被消除(除了閉包),處于活動狀態的執行背景關系環境只有一個 而作用域在函式定義時就已經確定了,不是在函式呼叫時確定(區別于執行背景關系環境,當然this也是背景關系環境里的成分) ```JavaScript // 全域作用域 let x = 100; function bar() { console.log(x); } // fn作用域 function fn() { let x = 50; // bar作用域 bar(); } fn(); // 100 ``` 作用域只是一個"地盤",其中沒有變數。變數時哦通過作用域對應的執行背景關系環境中的變數物件來實作的。**所以作用域是靜態觀念的,而執行背景關系環境是動態上的,兩者并不一樣。** ####變數物件 執行背景關系抽象成為了一個物件,擁有個屬性,分別是**變數物件,作用域鏈以及this指向**。 - 變數物件里面所擁有的東西 1. Arguments物件 2. 確定形式引數,檢查背景關系中函式宣告 3. 找到每一個函式宣告 - 就在 variableObject 下用函式名創建一個屬性,屬性值就指向該函式在記憶體中的地址的一個參考。 4. 確定當前背景關系中的區域變數,如果遇到和函式名同名的變數,則會忽略該變數 - 通過例子來演示函式的這兩個階段以及變數物件是如何變化的。 ```javascript const foo = function(i){ var a = "Hello"; var b = function privateB(){}; function c(){} } foo(10); //首先在建立階段 fooExecutionContext = { variavleObject : { arguments : { 0 : 10,length : 1 }, // 確定arguments物件 i : 10, // 確定形式引數 c : pointer to function c(), // 確定函式的參考 a : undefined, // 區域變數 初始值為 undefined b : undefined // 區域變數 初始值為 undefined }, scopeChain : {}, this : {} } ```
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/97646.html
標籤:基礎類
下一篇:matlab畫圖
