關於預編譯解釋過程
作用域定義:變數(變數作用於又稱上下文)和函式生效(能被訪問)的區域
首先 作用域 隨函式產生而產生 也就是我們常見的【【scope】】
1、每乙個js函式為乙個物件,物件函式屬性與方法,i他們歸js引擎所用 包括可見於不可見 。【【scope】】為其中乙個
2、【【scope】】其中儲存了 執行期上下文的集合 包括go(全域性)、ao(區域性就是預編譯過程中產生的ao)
3、[[scope]]中所儲存的執行期上下文物件的集合,這個集合呈鏈式鏈結,我們把這種鏈式鏈結叫做作用域鏈
要了解作用域鏈 就要知道執行器上下文的含義
執行期上下文:
當函式執行時(預編譯產生),會建立乙個稱為執行期上下文的內部物件。(本質為物件)
乙個執行期上下文定義了乙個函式執行時的環境,
函式每次執行時對應的執行上下文都是獨一無二的,所以多次呼叫乙個函式會導致建立多個執行上下文,
當函式執行完畢,執行上下文被銷毀。
當查詢變數:
查詢變數:從作用域鏈的頂端依次向下查詢 即從ao開始 - go
不說了上**
function a()
var a = 123;
b();
}var gloub = 100;
a();
函式a執行 開啟預編譯(a函式被定義) 產生執行期上下文 go
作用域中鏈中儲存 go 為第乙個資料
當a執行時 產生a函式的ao物件
a函式執行 引發b函式定義 定義時建立go(與a通用乙個)
接著b函式執行 建立b函式自己的ao物件 此時作用域鏈從頂端依次為 b函式ao a函式ao 公用的go物件
如下圖:
到此函式執行完畢 所有建立的執行期上下文銷毀 【【scope】】置空
直到下一次函式執行時會再次建立執行期上下文
再來一段**
function a()
c();
}; b();
}a();
執行期上下文建立過程如下:
以上形成的作用域鏈 我所舉例子為巢狀函式
內層函式可以訪問外層函式的ao值 反之不可以
同級之間的ao也不相通
Js作用域理解
如何理解 changecolor 函式可以訪問作用域 global scope changecolor scope自己作用域 swapcolor 函式可以訪問作用域 global scope changecolor scope外層函式 和swapcolor scope作用域 如何某乙個變數在當前函式...
JS作用域的理解
簡單來說,閉包是指有權訪問其他函式作用域中的變數的函式,是定義在函式內部的函式。當某個函式被呼叫時,會建立乙個執行環境和相應的作用域鏈,自由變數不斷向父級作用域中查詢其變數的定義。自由變數指當前作用域中沒有定義的變數。父級作用域是指函式定義時的上一級作用域,而不是函式執行的上一級作用域。閉包的使用場...
js作用域鏈的理解
18.12.26 執行環境定義了變數和函式有權訪問的其他資料。每個執行環境都有與之對應的變數物件 variable object 儲存著該環境中定義的所有變數和函式。全域性執行環境是最外圍的乙個執行環境,在web瀏覽器中,我們可以認為他是window物件,因此所有的全域性變數和函式都是作為windo...