網上關於閉包的介紹太多,這就導致了泛濫,對於新手來說,網上好多講解就說了閉包是啥,還都是用下面這種例子:
我的天啊,我們都看了不知道多少遍了,看完有啥用?在什么場合下用啊?
於是我翻閱各種資料,自己總結了一下:
相信大家在看我這篇文章之前應該看了好多關於閉包的講解了,其實只要記住一點,閉包就是函數里面有函數,里面的函數可以訪問父函數的變量。
使用場景如下:
1 . xhr.addEventListener("load",functionName, false);
如果functionName需要參數 怎么辦呢
可以再定義一個函數
function functionNameFnc(a){方法一
return function() //方法二
{
// 標示 做functionName該做的事情 已經可以用參數了
}
}
xhr.addEventListener("load",functionNameFnc(a), false);
這段代碼里,方法二在方法一里面,方法二還使用了方法一里面的變量,閉包!
2.
var a = [];for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; }
a[6](); // 10
變量i在整個函數內都有效沒有得到釋放。所以每一次循環,新的i值都會覆蓋舊值,導致最后輸出的是最后一輪的i的值。
解決這個問題的方法如下:
for (var i=0;i<10;i++) {
a[i]=(function(i){
return function() { console.log(i); })(i);
}
a[6](); // 6
這里使用了匿名函數,補充一下,匿名函數最大的用途是創建閉包(這是JavaScript語言的特性之一),匿名函數是立即執行的,執行完就釋放,閉包的一個缺陷就是變量一直沒有釋放,會導致內存泄漏。
這兩個例子應該可以讓你理解閉包的使用。。。