閉包面試題之閉包解決for循環打印

閉包的作用: 正常函數執行完畢後,裏面聲明的變量被垃圾回收處理掉,但是閉包可以讓作用域裏的 變量,在函數執行完之後依舊保持沒有被垃圾回收處理掉
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的值,最後一次輸出

閉包的缺陷:
通過上邊的例子也發現, 閉包會導致內存佔用過高,因爲變量都沒有釋放內存

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章