JavaScript中的閉包詳解

來源:互聯網
上載者:User

標籤:詞法   持久性   說明   cal   回收   amp   機制   執行   多少   

閉包是JavaScript的重要特性,非常強大,可用於執行複雜的計算,可並不容易理解,尤其是對之前從事物件導向編程的人來說,對 JavaScript 認識和編程顯得更難。特別是在看一些開源的JavaScript代碼時感覺尤其如此,跟看天書沒什麼區別。

一般情況下,人們認識一個事物,會根據之前的經驗,進行對比和總結,在腦中建立一個模型,從而理解掌握它,但是JavaScript與物件導向編程實在“沒有可比性”,最明顯的是某過於寫法,總覺得“怪怪的”,更不用說,其一些進階特性。如果說“對象”在物件導向編程時的出現相當有規律,但是在JavaScript中則毫無規律,無處不在,甚至在你意想不到的地方。

首先看兩段代碼。

樣本 1:

樣本 2:

樣本1 和樣本2都是閉包,只是2 比1複雜,甚至還有更複雜的寫法,比如返回多個閉包。

樣本 1,指令碼被載入記憶體後,並沒有為函數 sayHelloWorld()計算變數sMessage的值。該函數捕獲 sMessage的值只是為了以後的使用,也就是說,解釋程式知道在調用該函數時要檢查 sMessage 的值。sMessage將在函數調用sayHelloWorld()時(最後一行)被賦值,顯示訊息"hello world"。

樣本 2,函數addNum()包括函數doAdd() (閉包)。內建函式是一個閉包,因為它將擷取外部函數的參數 iNum1和iNum2以及全域變數 iBaseNum的值。 addNum()的最後一步調用了doAdd(),把兩個參數和全域變數相加,並返回它們的和。

這裡要掌握的重要概念是,doAdd()函數根本不接受參數,它使用的值是從執行環境中擷取的。

閉包,根據 ECMAScript 描述,詞法(lexically)表示包括不被計算的變數的函數,函數可以使用函數之外定義的變數,它意味著當前範圍總能夠訪問外部範圍中的變數。函數是JavaScript中唯一擁有自身範圍的結構,因此閉包的建立依賴於函數。函數內部的函數訪問其所在函數的變數(局部變數、形參),這些變數會受到內建函式的影響,當其外部函數外被調用時,就會形成閉包。內部的函數會在其外部函數返回後,被執行。

樣本 3:

說明: foo 是bar的外部函數,ba 是foo的內建函式;a是foo的局部變數; bar 訪問foo的局部變數 a; foo 返回bar。 bar在foo的外部被調用。 當執行 baz() 後,閉包使Javascript 記憶體回收機制不會回收foo所佔的資源。因為,baz 實際指向foo的內建函式bar,bar依賴 foo的局部變數a。這樣,在執行var baz=foo()後,baz實際指向了bar,而不是foo。bar訪問了foo的局部變數a,當執行baz()後,a 為20。這就形成了一個閉包。

如果把foo看作是一個包,根據剪頭指示,形成了一個閉包。結果是局部變數a的持久性(如樣本 4 所示)。下面代碼就不是閉包。無論執行多少次,都是顯示 20。

 

參考自:http://www.toutiao.com/a6459693220359045645/?tt_from=weixin&utm_campaign=client_share&app=news_article&utm_source=weixin&iid=14394189501&utm_medium=toutiao_ios&wxshare_count=1

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.