回覆列表
-
1 # 做前端的蝸牛
-
2 # 酷冰資訊分享
簡單通俗易懂的講就是一個函數里面還有一個函式,然後這個內部函數里用到了外部函式的變數,這個內部函式就叫閉包。
概念通俗易懂,不過也得注意其用途。
它的最大用處有兩個,一個是前面提到可以讀取函式內部的變數,另一個就是讓這些變數的值始終保持在記憶體中。
簡單解釋下這兩句話,我們在外部是無法訪問到函式內部的變數的,如果我們想要訪問,則可以透過在內部建立一個函式,也就是閉包來訪問這個函式,然後透過外部函式返回這個閉包,那我們在外部就可以透過這個閉包來訪問這個函式的內部變量了。
接著上面的情況,如果這個閉包我們賦值在一個全域性變數上,那麼這個閉包就儲存在記憶體中,由於閉包訪問了它外部函式的變數,所以又依賴於它的外部函式,這個外部函式也就儲存在記憶體中,不會再呼叫結束後被垃圾回收機制回收。
我是一名前端,無意間看見這個問題,我來回答一下!
我曾經寫過一篇部落格用來介紹閉包,談不上通俗易懂,但是可以理解的比較深入!我個人認為理解閉包的概念的前提是理解作用域以及js的垃圾回收機制!
定義
作用域:變數和函式的可訪問範圍!
閉包:在某個作用域內定義的函式,它可以訪問這個作用域內的所有變數!
從定義上看,我覺得閉包是函式作用域中一種現象,而且在es6之前,js只有函式級作用域,沒有塊級作用域,那麼我們就來看看函式級作用域的特點!
函式級作用域
[[scope]]是所有父變數物件的層級鏈,處於當前函式上下文之上,在函式建立時存於其中。
全域性上下文的變數物件是:
在getIdFac建立時,它的[[scope]]屬性是:
在getIdFac執行時,其上下文的活動物件是:
getIdFac上下文的作用域鏈為:
內部函式cac建立時,其[[scope]]為:
在cac執行時,其上下文的活動物件為:
cac上下文的作用域鏈為:
記憶體管理
由於cac在包含它的函式外執行,對全域性作用域中的變數x 和 父函式中y存在這個引用,所以呢,x和y所佔的儲存空間不會被回收!
綜上,閉包存在於函式中,它是作用域的一種現象!