這里我們根據之前介紹的閉包延伸一下其他的知識點。
在閉包中,其保存的是整個變量對象。閉包只能取得包含函數中任何變量的最后一個值。下面舉個栗子:
以上整個函數createFn()執行后會返回一個result數組,表面上看result數組中的每個函數執行后會返回自己的索引值,例如0位置的函數返回0,1位置的函數返回1....,,實際上返回的都是10,。這是因為每創建的內部函數會將外部函數即createFn的活動對象添加到其作用域鏈上,所以它們引用的都是同一個變量i。所以當createFn函數返回后,i的值已經變為10了,所以內部函數所引用外部函數i的值也就是10了。如果要輸出的是每個函數在數組中的下標,我們可以創建另一個匿名函數。如下:
關于this對象:this對象是在運行時基于函數的執行環境綁定的,在全局函數中,this等于window,而當函數被作為某個對象的方法調用時,this等于那個對象。然而,匿名函數的執行環境是具有局限性,其this對象通常是指向window的。
由于閉包的編寫,這一點可能有些不同:
當執行obj對象中getName方法返回出來的函數,猜猜會返回什么字符串。并不是"MY NAME",返回的是"WINDOW"。
這是因為,每個函數調用的時候都會去得到兩個特殊的變量,this和arguments。內部函數在搜索這兩個變量時,只會搜索到其活動對象位置。因為不會訪問其外部函數這個兩個變量。如果把外部函數的this存到閉包能夠訪問到的變量里面,那么就可以讓閉包訪問該對象了。
this和arguments有同樣的問題,那么就用同樣的方法進行處理就好了。
內存泄漏:閉包在IE的這些版本中會導致一些特殊的問題。如果閉包的作用域鏈中保存一個HTML元素。那么就意味著這個元素無法被銷毀。
以上函數創建了一個作為ele元素事件處理程序的閉包。這個閉包又引用了外部函數的一個變量ele,這就導致無法減少對ele的引用,只要匿名函數存在,那么就用于不會收回。
必須記住:閉包會引用包含函數的整個活動對象!!而并不是其中的某個變量或者dom元素。
--------以上根據javascript高級程序設計總結。