作用域和作用域鏈 scope

2021-09-11 06:34:57 字數 2503 閱讀 3987

作用域

函式建立時,生成的乙個js內部隱式屬性;

函式儲存作用域鏈的容器。ao:函式執行期上下文;go:全域性執行期上下文。

函式執行完成後,ao是要銷毀的。在次執行fun時會重新生成ao

functiona(

)var a =1;

b();

}var c =3a

();/*

執行說明:

當a函式在定義時:

模組一:系統生成了[[scope]]屬性,[[scope]]儲存的是該函式的作用域鏈。

[[scope]] -> scope chain 作用域鏈

模組二: 該作用域鏈的第0位儲存的是go全域性執行期上下文。

go 裡儲存全域性下的所有物件,其中包含函式a和全域性變數c

scope chain 作用域鏈

0 -> go 全域性執行上下文

模組三:go的內容:this -> window;

window -> object

document -> object

a -> function

c -> 3

*/

函式a

「」[[scope]]

scope chain 作用域鏈

scope chain

scope chain作用域鏈「」0

go

go 全域性執行上下文

go全域性執行上下文

「」this

window

window

object

document

object

afunctionc3

/*

當a函式被執行時(前一刻)

作用域鏈的頂端(第0位)儲存a函式生成的函式執行期上下文ao,同時第一位儲存的是go

查詢變數的順序是從a函式的作用域鏈中從頂端開始一次向下查詢

*/

函式a

「」[[scope]]

scope chain 作用域鏈

scope chain

scope chain作用域鏈「」0

函式a的ao1go

a的ao

函式a的ao函式執行期上下文

「」this

window

arguments

a1bfunction

go 全域性執行上下文

go全域性執行上下文

「」this

window

window

object

document

object

afunctionc3

/*

當b函式被定義時,

是在a函式環境下,所以b函式這時的作用域鏈就是a函式被執行期的作用域鏈。效果同上

*/

/*

當b函式被執行時(前一刻)

生成函式b的[[scope]],儲存函式b的作用域鏈,頂端第0位儲存b函式的ao,a函式的ao和全域性的go依次向下排列

*/

函式b

「」[[scope]]

scope chain 作用域鏈

scope chain

scope chain作用域鏈「」0

函式b的ao

1函式a的ao2go

b的ao

函式b的ao函式執行期上下文

「」this

window

arguments

b2

a的ao

函式a的ao函式執行期上下文

「」this

window

arguments

a1bfunction

go 全域性執行上下文

go全域性執行上下文

「」this

window

window

object

document

object

afunctionc3

/*

當b函式執行結束後,b函式的ao被銷毀,回歸被定義時的狀態

*/

/*

當a函式被執行結束時,a函式的ao被銷毀的同時,b函式的[[scope]]也將不存在。a函式回歸到被定義時的狀態。

*/

作用域和作用域鏈

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

作用域和作用域鏈

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

作用域和作用域鏈

執行環境定義了變數和函式有權訪問的其他資料,決定了他們各自的行為。每個執行環境都有與之對應的變數物件 variable object 儲存著該環境中定義的所有變數和函式。我們無法通過 來訪問變數物件,但是解析器在處理資料時會在後台使用到它。執行環境有全域性執行環境 也稱全域性環境 和函式執行環境之分...