1. 作用域
- 上一級在執行時,內部函數被定義,內部函數便生成作用域和作用域鏈(拿上一級的環境),內部函數執行前生成自己的AO,并排在頭部
- 函數執行結束時,AO被銷毀(回到被定義時的狀態)
- 上一級函數銷毀時,AO被銷毀(其中含內部函數,和其作用域)
- 作用域鏈里存的是AO、GO的引用
- 每個函數在被定義時,就包含了全局上下文GO,即使這時函數還沒被執行
- a函數在被執行的前一刻,做預編譯
- b函數被定義時,它的作用域鏈和a函數是一樣的(同理a函數被定義時,a的作用域鏈是GO)
2. 閉包
- 閉包的定義:閉包是指有權訪問另一個函數作用域中的變量的函數(并不是只有函數內返回函數的情況才是閉包)
- 一個函數和對其周圍狀態(lexical environment,詞法環境)的引用捆綁在一起(或者說函數被引用包圍),這樣的組合就是閉包(closure)。也就是說,閉包讓你可以在一個內層函數中訪問到其外層函數的作用域。在 JavaScript 中,每當創建一個函數,閉包就會在函數創建的同時被創建出來。
function init() {var name = "Mozilla"; // name 是一個被 init 創建的局部變量function displayName() { // displayName() 是內部函數,一個閉包alert(name); // 使用了父函數中聲明的變量}displayName();
}
init();
- 閉包拉扯著父級函數的AO不釋放,閉包的函數運行在哪個環境,這個環境就能訪問到被拉扯著的AO
-
test2被放到了全局,無法跟著test1銷毀
-
內存泄漏:內存越來越少
-
閉包可以做數據緩存
-
閉包:也就是內部能拉扯外部AO的函數,能在全局被訪問,那么直接把它添加到全局,也能有一樣的效果