淺談對Js閉包的理解

來源:互聯網
上載者:User

標籤:style   blog   class   code   java   color   

理解Js的閉包,首先讓我們先看幾個概念

執行環境(executive environment)每個函數都有自己的執行環境,匿名函數預設為全域環境。

範圍鏈(scope chain)子函數繼承父函數,但是父函數不能引用子函數。

變數對象(variable object)分為全域變數對象,和局部變數對象,前者的生存在整個環境中,後者在生存在函數的執行環境下,就是說,執行函數時被建立,當函數執行完後被銷毀。

怎麼被銷毀的啊?目前最常見的演算法是當變數對象不再被引用時,便可回收記憶體。

但是,若是想在函數外部存取函數內部的變數,就要用的閉包。

例如下面的程式:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 var cat = "Hello Kitty";   function findCat(){     var cat = "Garfield"     var dog = "Odie"     return function(){         return alert(cat);     } }   var myCat = findCat(); myCat();   //Garfield

我們在函數外部存取到了,函數裡面的變數“Garfield”

匿名函數為findCat()內建函式,繼承其範圍鏈,能夠找到變數cat。

範圍鏈:(優先順序從0開始)

  2        全域環境

 變數對象: cat = “Hello Kitty” 

  1       findCat()環境

 變數對象:cat = “Garfield”

  0       匿名函數

 變數對象:無 

 

 

變數對象不是在函數findCat執行完就已經被敲毀了嘛?

但是,我們在執行完findCat後,只是銷毀了範圍鏈,(範圍鏈就是一個指向變數對象的指標),當使用中的物件被引用的次數為0就會被銷毀,但是不要忘了,我們的匿名函數繼承了父函數的範圍鏈,在閉包中,cat這個變數對象,仍然在被引用,所以不會被銷毀。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.