閉包的作用: 正常函數執行完畢後,裏面聲明的變量被垃圾回收處理掉,但是閉包可以讓作用域裏的 變量,在函數執行完之後依舊保持沒有被垃圾回收處理掉
1、正常的for循環打印
for (var i = 0; i < 4; i++) {
console.log(i);
輸出的是0、1、2、3
2、加了延遲的for循環打印
for (var i = 0; i < 4; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
輸出的是4、4、4、4
這裏有了延遲,跟js的事件循環機制有關係:相關文章:https://blog.csdn.net/Sunday97/article/details/99945348
3、運用閉包解決上述問題
方法一:
for (var j = 0; j < 4; j++) {
setTimeout((function(j) {
return function() {
console.log(j)
}
})(j),1000)
}
輸出0、1、2、3
解析:其中的 return function() {console.log(j) }是一個閉包,用來獲取setTimeout方法裏面的function函數的參數j,並會將每一個j的值保存下來,當輪到裏面的輸出函數執行的時候就自然輸出的是當時的j的值
方法二:
for (var j = 0; j < 4; j++) {
var temp = j;
setTimeout((function(temp) {
return function() {
console.log(temp)
}
})(temp),1000)
}
該方法和方法一類似
方法三:
for(var j = 0;j < 4;j++){
(function(val) {
setTimeout(function(){
console.log(val)
},1000)
})(j)
}
解析:該方法是setTimeout裏面的函數參數是一個閉包,它的父函數是一個立即執行函數,閉包函數會保存立即執行函數裏面傳入的j的值,最後一次輸出
閉包的缺陷:
通過上邊的例子也發現, 閉包會導致內存佔用過高,因爲變量都沒有釋放內存