讀懂閉包

閉包

我的理解就是把內部函數、變量什麼的暴露出去,使在外部可訪問。閉包至少有兩個函數,一個外部函數,一個內部函數

紅皮書中關於閉包講的很詳細,看過了在這裏作個記錄:html

  • 閉包與變量

閉包只能取得包含函數中任何變量的最後一個值,由於閉包所保存的是整個變量,而不是某個特殊變量es6

function creatFunctions(){
    var result=new Array()
    for(var i=0;i<10;i++){
      result[i]=function(){
        return i
      }
    }
    return result;
  }

這段代碼返回的每一個值是10,而不是看起來的1,2,3........,再看下面的代碼:數組

function creatFunctions(){
    var result=new Array()
    for(var i=0;i<10;i++){
      result[i]=function(num){
        return function(){
          return num
        }
      }(i)
    }
    return result;
  }

發現不一樣了麼,第二段代碼中不是把閉包賦值給數組,而是定義一個匿名函數,傳入參數,並當即執行。由於函數參數是按值傳遞,這樣就能夠遍歷出1,2,3........閉包

  • this

this的問題看了好久,也看了不少次,這裏結合閉包說一下
注意:在全局函數中,this等於window,當函數被當作某個對象的方法調用時,this等於那個對象函數

var name="The Window"
  var object={
    name:"hello",
    getNameFunc:function(){
      return function(){
        return this.name
      }
    }
  }
  alert(object.getNameFunc()())

在調用object.getNameFunc()()時,是兩個括號,此時彈出的是The Window,猜猜爲何?
若是去掉括號,變成alert(object.getNameFunc())此時彈出的是
圖片描述this

對,就是把裏面的內容打印出來了,並無調用。內部函數在搜索this和arguments時,只會搜索到活動對象爲止,所以這裏永遠不能打印出hello,能夠把代碼作這樣的修改spa

getNameFunc:function(){
      var _this=this
      return function(){
        return _this.name
      }
    }

這樣就能當問到hello,_this是咱們在包含函數中特地聲明的一個變量,因此閉包也能夠訪問
注:用es6的箭頭函數也能夠解決這個問題code

  • 是否會形成內存泄漏?

所謂的內存泄漏,是指IE9以前的版本對JScript對象和COM對象使用不一樣的垃圾收集歷程,因此閉包在IE的這些版本中可能致使一些特殊的問題,這是能夠解決的。
好比閉包的做用域中保存html元素時,覺得這鈣元素將沒法被銷燬,這時,能夠把該對象的副本,加入是element.id保存在變量中,而後閉包結束時,把element=null置爲空htm

謹記:閉包會應用包含函數的整個活動對象對象

相關文章
相關標籤/搜索