1. 程式人生 > >分針網——每日推薦: 各路神仙關於閉包概念不同解讀

分針網——每日推薦: 各路神仙關於閉包概念不同解讀

閉包

寫在前面:
閉包是被講爛的內容,但是當我不了解的情況下,看過很多教程,聽過很多道理,還是無法完全理解閉包這個東西。所以想要寫一篇比較詳細,前端小白也能夠真正理解閉包概念的幹貨文章,本文參考很多閉包資料,希望能真正把閉包這個東西講清楚,喜歡的朋友可以點個贊,或者點波關註。
首先需要了解一波js變量的作用域以及變量的生存周期
前幾天我發在掘金上面了,下面是一個內容概要,墻裂推薦所有小夥伴,還是點進去學習一波,作用域這個問題可以說是閉包最為重要的內容。

裏面的內容包括:
1.變量的作用域(變量的有效範圍)。 2.變量作用域,js高級程序設計(紅寶書)中的解釋。 3.紅寶書中的作用域鏈栗子(還有一個例子的解析:畫重點,這裏關於作用域講的比較詳細,看完這個作用域就了解差不多)。 4.變量的生存周期。
閉包的概念:不同解讀一覽。
以下節選了一些對閉包概念的不同理解,基本都沒偏離本質,我進行一些解釋和畫重點操作,小夥伴們可以從中挑選一款相對於自己來說比較好理解的概念,自己意會。

維基百科
閉包,不同於一般的函數,它允許一個函數在立即詞法作用域外調用時,仍然訪問非本地變量
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() 就是一個閉包。

轉載:http://www.jianshu.com/p/0a63e98067c2

作者: OBKoro1

本文轉載自分針網

想學更多IT知識可加群:272292492

分針網——每日推薦: 各路神仙關於閉包概念不同解讀