理解JavaScript閉包

來源:互聯網
上載者:User

標籤:

  • 什麼是閉包

閉包是指有權訪問另一個函數範圍中的變數的函數(有點拗口吧),簡單點就是在一個函數的內部建立另外一個函數,並返回這個函數的引用。(這也是建立閉包的常用方式)

function outerFunc (outerNum) {        return function innerFunc(innerNum) {        outerNum=outerNum+innerNum;        return outerNum;    }}var inner=outerFunc(1);var a1=inner(11);console.log(a1)//輸出為12var a2=inner(2);console.log(a2)//輸出為14

上面的代碼就建立了一個閉包,裡面的innerFunc有權訪問外面函數的變數outerNum。

不明白,沒關係,我們先看執行這個函數的記憶體情況

在JavaScript裡面,有一個概念叫做範圍,我們定義一個下面的函數

function sample (value1,value2) {    var temp;    temp=value1+value1;    return temp;}var result=sample(5,6);

 當sample函數執行時的範圍鏈如下

 

背景每個執行環境都有一個表示變數的對象(變數對象)。全域環境的變數對象始終存在,而像sample()函數這樣的局部環境變數對象,則只在函數的執行過程中存在。

當sample(5,6)執行完畢後,sample的執行環境的範圍鏈就會被銷毀,sample()的使用中的物件就沒有被引用了,那麼sample()的使用中的物件就會被銷毀,如的紅色虛線框表示就要被銷毀的。因為全域變數對象是需要整個執行環境被銷毀才會被銷毀(整個程式執行完畢,程式退出後)。

  • 閉包的範圍鏈

現在我們回到最初的閉包,看看這個閉包的範圍鏈又是怎樣的

如,當outerFunc(1)執行後,outerFunc的執行環境範圍鏈就要被銷毀,就是紅色虛線框的部分表示被銷毀的,本來outerFunc()的使用中的物件也是要被銷毀的,但是系統檢測到,outerFunc()的使用中的物件還被innerFunc的執行環境範圍鏈引用,所以它就被儲存了下來,也就是說裡面的值也被儲存了下來

執行完inner(11)後,outerNum=12,再執行inner(2)的話,outerNum=14

 

理解JavaScript閉包

聯繫我們

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