作用域以及作用域鏈

2021-09-26 10:40:12 字數 1630 閱讀 8268

[[scope]]指的就是我們所說的作用域 其中儲存了 執行期上下文 的集合

執行期上下文就是所說的ao;

作用域鏈:[[scope]]中所儲存的執行期上下文物件的集合 這個集合呈鏈式

鏈結 我們把這種鏈式鏈結叫做作用域鏈。

執行期上下文:當函式執行時 會建立乙個稱為 執行期上下文(ao) 的內部物件。

乙個執行期上下文定義了乙個函式執行時的環境,函式每次執行時對應的執行

上下文都是獨一無二的,所以多次呼叫乙個函式會導致建立多個執行上下文,當函式

執行完畢,它所產生的執行上下文被銷毀。

查詢變數:從作用域鏈的頂端依次向下查詢 (在哪個函式裡面查詢變數就去哪個函式的作用域鏈的頂端依次向下查詢 )

根據我個人理解就是說作用域鏈就是在作用域中一層一層的查詢,然後所形成的鏈就是作用域鏈了

看**解釋吧

function a()

c()}

b()}

a()

執行的步驟

第一步 a被定義

a[[scope]] ---- 0:go

第二步 a被執行

a[[scope]] ---- 0:ao 1:go

第三步 b被定義

b[[scope]] ----- 0:a[[scope]].ao 1:a[[scope]].go

第四步 b被執行

b[[scope]] ----- 0:ao 1:a[[scope]].ao 2:a[[scope]].go

第五步 c被定義

c[[scope]] ----- b[[scope]] ----- 0:ao 1:a[[scope]].ao 2:a[[scope]].go

第六步 c被執行

c[[scope]]----0:ao b[[scope]] ----- 0:ao 1:a[[scope]].ao 2:a[[scope]].go

簡單點的執行步驟

a defined a.[ [scope]] – > 0 : go

a doing a. [[scope]] – > 0 : aao

1 : go

b defined b. [[scope]] – > 0 : aao

1 : go

b doing b. [[scope]] – > 0 : bao

1 : aao

2 : gof

c defined c. [[scope]] – > 0 : bao

1 : aao

2 : go

c doing c. [[scope]] – > 0 : cao

1 : ba0

2 : aao

3 : go

再來個小例子吧

function a() 

var aa = 123;

b()console.log(aa);

}var glob = 100;

a()

其實簡單點來說就是說 內部函式查詢變數的時候 它會先在自身裡面找 如果自身沒有

他就會向上一層查詢 上一層沒有 在向上查詢 一直查詢到全域性 也就是函式體的外面

如果都沒有 返回undefined

作用域 作用域鏈

理解 就是一塊 地盤 乙個 段所在的區域 它是靜態的 相對於上下文物件 在編寫 時就確定了 分類全域性作用域 函式作用域 沒有塊作用域 es6有了 作用隔離變數,不同作用域下同名變數不會有衝突 區別1全域性作用域之外,每個函式都會建立自己的作用域,作用域在函式定義時就已經確定了。而不是在函式呼叫時 ...

作用域,變數作用域,作用域鏈知識

第2章 變數作用域 第3章 作用域鏈 預覽 1.全域性作用域 整個script標籤下 或者是單獨的js檔案 外部js 2.區域性作用域也叫 函式作用域 在函式內部就是區域性作用域 這個 的名字 變數 只在函式內部起作用和效果 3.不同作用域下,定義相同變數名是不衝突的。如果是在同一作用域宣告2個相同...

作用域和作用域鏈

全域性作用域 全域性的變數執行環境 函式作用域 函式內部的變數執行環境 每個函式都有自己的執行環境,當執行流進入乙個函式時,函式的環境就會被推入乙個環境棧中。函式執行之後,棧將環境彈出,把控制權返回給之前的執行環境。全域性作用域只要頁面不解除安裝,就一直存在,不釋放。函式每次在呼叫時,都會形成乙個作...