簡短几句 通俗解釋javascript的閉包

來源:互聯網
上載者:User

何謂沒有被釋放資源的棧區和預執行的過程,用一個最常見的樣本來解釋:
比方現在我們有一個ul,下面有很多個li,需要遍曆他們為他們綁定單擊事件,並在點擊後將當前下標傳遞給另外一個function來進行額外的處理: 複製代碼 代碼如下:for(var i=0; i<agroup.length; i++) {
  agroup[i].onclick = function() {
    handler(i);
  }
}

執行結果顯而易見對吧?在handler中,擷取傳遞過去的參數i,你看到的將全部是最大的下標,這個時候,我們通常用下面的辦法解決: 複製代碼 代碼如下:for(var i=0; i<agroup.length; i++) {
  agroup[i].i = i
  agroup[i].onclick = function() {
    handler(this.i);
  }
}

那麼在這裡,先講一下this的指向問題,從通常來說,javascript中的this是指向當前引用他的對象的。上面我們相當為this新增了一個為i的屬性,他的值就是當前的下標值。
那麼用閉包的方式如何解決這個問題?其實原理相同,我們需要預先的把i值儲存起來,或叫作傳遞: 複製代碼 代碼如下:for(var i=0; i<agroup.length; i++) {
  agroup[i].onclick = function(index) {
    return function() {
      handler(index);
    }
  }(i);
}

這個時候你會得到正確的下標,這樣做與增加i屬性有何雷同之處?也就是他們都預先把下標i值傳遞或是儲存起來。在上面的示範中,預執行onclick所引用的函數,而這個
函數當中返回了一個內嵌函數,形成一個沒有被釋放資源的棧區,並在預執行的時候將i值以參數的形式傳入這個範圍(解釋能力有問題,這句解釋不知道是否準確,歡迎磚拍)。
綜上所述,閉包的作用通常是改變範圍或預執行。應該看官很明白了,上面個出的樣本很局限,閉包的應用範圍是很廣的,瞭解其因果,才能靈活的使用它。
auntion 2011-11-15
mail Auntion@gmail.com
QQ 82874972
原創文章,請尊重打字的辛勞和作者的權益,轉載時請不要刪除這裡的作者資訊。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.