4 6 聊聊作用域鏈

2021-10-04 19:32:52 字數 1298 閱讀 7629

前面的話

前端日問,鞏固基礎,不打烊!!!

解答先來說幾個概念:

函式執行上下文中的ao

函式的執行上下文在呼叫時被建立,建立之後分為兩個階段:進入執行上下文執行**。這兩個過程的ao會有一定的差異,下面通過例子來分析:

function

foo(a)

vard

=function()

; b =3;

}foo(1

);

當執行foo函式時,會建立相應的執行上下文。

在**執行階段,會順序執行**,然後改變ao物件中的值,當**執行完畢之後,對應的ao會變為:

ao=,

a:1, b:3,

c: reference to functionc(

),d: reference to functionexpression "d"

}

總結

作用域鏈

定義:由多個執行上下文的變數物件構成的鍊錶。

通俗來說,比如乙個函式裡面,訪問了乙個變數,先從其ao物件中找,如果沒有的話就從其父級的中的ao物件中找,最終找到全域性物件。

函式建立時:

函式有乙個內部屬性[[scope]], 當函式建立時,就會儲存所有父級的變數物件到其中。

舉個例子:

function

foo(

)}

函式建立時,各自的[[scope]]為:

foo.

[[scope]]=

[ globalcontext.vo]

;bar.

[[scope]]=

[ foocontext.ao,

globalcontext.vo]

;

函式被呼叫時

當函式被呼叫時,會建立函式執行上下文,將自身的ao物件新增到作用域鏈的前端。

此時再來看一下上面兩個函式的作用域鏈:

foo.

[[scope]]=

[ao, globalcontext.vo]

;bar.

[[scope]]=

[ao, foocontext.ao,

globalcontext.vo]

;

作用域 作用域鏈

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

作用域和作用域鏈

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

作用域和作用域鏈

var a 10 function f1 x,y f1 console.log b 此時b輸出5,因為b 5為隱式的全域性變數 在函式外面使用var 宣告的變數都是全域性變數,作用範圍是程式執行的地方.全域性作用域 函式除外 函式的形參是區域性變數 在函式內部,不使用var 定義的變數,叫隱式全域性...