【閉包概念】關於閉包概念不同解讀——你可以自己理解。

OBKoro1發表於2019-03-03

寫在前面:

閉包是被講爛的內容,但是當我不瞭解的情況下,看過很多教程,聽過很多道理,還是無法完全理解閉包這個東西。所以想要寫一篇比較詳細,前端小白也能夠真正理解閉包概念的乾貨文章,本文參考很多閉包資料,希望能真正把閉包這個東西講清楚,喜歡的朋友可以點個贊,或者點波關注。

首先需要了解一波js變數的作用域以及變數的生存週期。

前幾天我發在掘金上面了,下面是一個內容概要,牆裂推薦所有小夥伴,還是點進去學習一波,作用域這個問題可以說是閉包最為重要的內容。

裡面的內容包括:

1.變數的作用域(變數的有效範圍)。
2.變數作用域,js高階程式設計(紅寶書)中的解釋。
3.紅寶書中的作用域鏈栗子(還有一個例子的解析:畫重點,這裡關於作用域講的比較詳細,看完這個作用域就瞭解差不多)。
4.變數的生存週期。

這裡是連結,點進去學習一波:js 變數的作用域詳解、生存週期,以及一些小細節。


閉包的概念:不同解讀一覽。

以下節選了一些對閉包概念的不同理解,基本都沒偏離本質,我進行一些解釋和畫重點操作,小夥伴們可以從中挑選一款相對於自己來說比較好理解的概念,自己意會

維基百科

閉包,不同於一般的函式,它允許一個函式在立即詞法作用域外呼叫時,仍然訪問非本地變數

MDN上面這麼說:

閉包是一種特殊的物件。閉包是由兩部分構成:函式,以及建立該函式的環境。環境由閉包建立時在作用域中的任何區域性變數組成。

閉包概念 根據《javascript權威指南》裡對閉包的解釋:

所有的javascript函式都是閉包。而當一個巢狀函式被匯出到它所定義的作用域外時,閉包會更有趣。

ps:我們通常意義上的閉包指的是在一個函式內部巢狀另一個函式,這裡的概念很有趣。把所有函式都當成閉包,相當於把所有區域性環境都當成了一個閉包,細細想想覺得蠻有道理的,這裡就見仁見智了。

阮一峰的理解:

閉包就是能夠讀取其他函式內部變數的函式。

由於在Javascript語言中,只有函式內部的子函式才能讀取區域性變數,因此可以把閉包簡單理解成"定義在一個函式內部的函式"。
所以,在本質上,閉包就是將函式內部和函式外部連線起來的一座橋樑。

javascript高階程式設計(紅寶書)的解釋):

閉包就是指有權訪問另一個函式作用域中的變數的函式

感覺這裡比較簡單且清晰,對此要解釋一波,上面的意思是:

閉包是一個函式內部巢狀著另一個函式,而被巢狀的那個函式有權利訪問巢狀它的那個函式的作用域中變數。

上面這裡分點來讀,慢慢讀。

1.被巢狀的那個函式
2.有權利訪問
3.巢狀它的那個函式
4.的作用域中
5.的變數。


這裡有一張幫助你理解閉包概念的圖片:

用圖片來記憶,記憶效率還是高一點,而且是這麼特別的一張圖片,這麼6的圖片,出自一張圖搞定閉包概念

【閉包概念】關於閉包概念不同解讀——你可以自己理解。
號稱一張圖搞定閉包概念,哈哈,反正我單單看這張圖片,我是猜不透想表達什麼

圖片解釋:描述巢狀函式的閉包情況。

1.打個比方:有一隻襪子,它的內部就好比是一個鏈式作用域
ps:作用域鏈的定義以及解析,在上面變數部分的連結裡面。

2.小人無法直接獲得襪子內部的“a”。這裡的“a”就好比鏈式作用域裡的一個區域性變數;
ps:藍色圈圈裡面的作用域形成了一個閉包,所以外面的無法訪問a。

3.藍色小圓圈就好比是內部鏈式作用域裡的巢狀函式(閉包)。它可以通過鏈式作用域獲取到“a”;

4.藍色小圓圈通過伸出到襪子外的箭頭,讓小人可以拉取。這好比巢狀函式返回到外部;(return)

5.小人不斷拉取小圓圈的線,把襪子裡面翻了出來。他通過獲取的藍色小圓圈,順利的獲取到了“a”;

ps:這裡想表達的意思是:小人是全域性環境,襪子是一個函式,藍色圈圈是襪子函式裡面巢狀的函式,a是巢狀函式中的變數。


產生一個閉包:

建立閉包最常見方式,就是在一個函式內部建立另一個函式

function func(){
  var a = 1,b = 2;

  function closure(){
    return a+b;
  }
  return closure;
}複製程式碼

上面例子中的 函式closure() 就是一個閉包。

閉包的作用域鏈:包含著它自己的作用域,以及包含它的函式的作用域和全域性作用域。
(作用域鏈這塊兒前面變數那裡講的很清楚了,不再贅述)


以下,我會再擴充套件開,過幾天發出來:

閉包的注意事項。
閉包的應用。
常見錯誤,在迴圈中建立閉包。
閉包的面試題。

後話:

想認真寫明白一個東西真難,本文其實寫到這裡好幾天了。最後那些沒有擴充套件開的,希望能夠寫的詳細點,然後就一直想著怎麼寫的更通俗一點。so,我先發這個出來,後面幾個一個一個,慢慢解決。到時候,放連結連結起來。

最後:碼字不易,感謝支援!因為我經常看不懂別人寫的分享,所以個人寫文比較偏小白,寫的不好之處,歡迎指點。然後就是希望看完的朋友點個喜歡,也可以關注一下我。
ps:目前待業,座標北京,本人適應網際網路快節奏,高強度,持續學習,持續成長,認真,嚴謹,學習積極性強。中小公司大佬求帶走,郵箱:1677593011@qq.com。
掘金個人主頁簡書主頁連結csdn部落格主頁連結

相關文章