作用域
函式建立時,生成的乙個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 chainscope chain作用域鏈「」0
go
go 全域性執行上下文go全域性執行上下文
「」this
window
window
object
document
object
afunctionc3
/*
當a函式被執行時(前一刻)
作用域鏈的頂端(第0位)儲存a函式生成的函式執行期上下文ao,同時第一位儲存的是go
查詢變數的順序是從a函式的作用域鏈中從頂端開始一次向下查詢
*/
函式a
「」[[scope]]
scope chain 作用域鏈
scope chainscope 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 chainscope 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 儲存著該環境中定義的所有變數和函式。我們無法通過 來訪問變數物件,但是解析器在處理資料時會在後台使用到它。執行環境有全域性執行環境 也稱全域性環境 和函式執行環境之分...