紅寶書第七章:
7.2閉包:
1.閉包是指有權訪問另乙個函式作用域中的變數的函式。建立閉包的常用方式,就是在乙個函式內部建立另乙個函式。
2.p178的**塊:
內部函式能訪問外部函式中的變數,是因為內部函式的作用域鏈中包含 外部函式的作用域
3.p179的**塊:
compare()函式的作用域鏈,第一層作用域鏈包含預設的arguments和value1 value2 引數(這三個統稱為compare的活動物件)
第二層作用域鏈包含全域性變數物件compare 和 result。
4.在建立函式時,會建立乙個預先包含全域性變數物件的作用域鏈,這個作用域鏈會被儲存在內部的[[scope]]屬性中。當呼叫函式時,會為函式建立乙個執行環境,然後通過複製函式的[[scope]]屬性中的物件構建起執行環境的作用域鏈。此後又有乙個活動物件被建立並被推入執行環境作用域鏈的最前端。
5.作用域鏈本質上是乙個指向變臉物件的指標列表,它只引用但不實際包含變數物件。
6.一般來講,當函式執行完畢後,區域性活動物件就會被銷毀,記憶體中僅儲存全域性作用域(全域性執行環境的變數物件)
7.在匿名函式(內部函式)從外部函式中被返回後,它的作用域鏈被初始化,為包含外部函式的活動物件和全域性變數物件。
更為重要的是,在外部函式執行完畢後,其活動物件也不會被銷毀,因為匿名函式的作用域鏈仍然在引用這個活動物件。換句話說,當外部函式返回後,其執行環境的作用域鏈會被銷毀,但它的活動物件仍然會留在記憶體中,直到匿名函式被銷毀後,外部函式的活動物件才會被銷毀。
解除對匿名函式的引用:
comparenames = null;
8.匿名函式執行環境的作用域鏈:
第一層:閉包的活動物件,arguments 和匿名函式的引數
第二層: 外部函式的活動物件,arguments 和外部函式的引數
第三層 : 全域性變數物件
9.關於this指向:
匿名函式的執行環境具有全域性性,因此其this物件通常指向window。
10.記憶體洩漏:
如果閉包的作用域鏈中儲存著乙個html元素,那麼就意味著該元素將無法被銷毀。因為外部函式的活動物件至少被引用一次
11.模仿塊級作用域:
js沒有塊級作用域
(
function()
)()
12.函式宣告後面不能跟圓括號,然而函式表示式後面可以跟圓括號 JS閉包理解
下圖例項 body ul li 1 li li 2 li li 3 li ul body html script vara document.getelementsbytagname li for vari 0 i a.length i i 如何從外部讀取區域性變數 functionvisitinn...
JS閉包理解
js閉包理解 在很多面試題中都會問什麼是js的閉包,為什麼需要使用閉包,使用閉包的優缺點!我在面試其他人的時候也喜歡問這個問題,回答的也是千奇百怪,現在就總結一下我對閉包的理解。閉包是一種概念,這種概念比較複雜,很多地方的定義不盡相同,我的理解是 閉包是能讀取函式內部變數的函式,也就是定義在函式內部...
js閉包理解
什麼是閉包?這兩天我在網上翻閱了大量的閉包理解部落格,有優秀的也有生搬硬套的。歸根揭底,還是理解的問題。我曾經聽老師講閉包後,還是一臉疑惑,然後下課去網上查閱資料,仔細研究之後知道是裡面要套乙個函式返回父級變數。這次我就講解一下個人理解的閉包。為什麼會出現閉包?首先,我們先想下,我現在需要乙個一直用...