回覆列表
  • 1 # 做前端的蝸牛

    我是一名前端,無意間看見這個問題,我來回答一下!

    我曾經寫過一篇部落格用來介紹閉包,談不上通俗易懂,但是可以理解的比較深入!我個人認為理解閉包的概念的前提是理解作用域以及js的垃圾回收機制!

    定義

    作用域:變數和函式的可訪問範圍!

    閉包:在某個作用域內定義的函式,它可以訪問這個作用域內的所有變數!

    從定義上看,我覺得閉包是函式作用域中一種現象,而且在es6之前,js只有函式級作用域,沒有塊級作用域,那麼我們就來看看函式級作用域的特點!

    函式級作用域

    [[scope]]是所有父變數物件的層級鏈,處於當前函式上下文之上,在函式建立時存於其中。

    全域性上下文的變數物件是:

    在getIdFac建立時,它的[[scope]]屬性是:

    在getIdFac執行時,其上下文的活動物件是:

    getIdFac上下文的作用域鏈為:

    內部函式cac建立時,其[[scope]]為:

    在cac執行時,其上下文的活動物件為:

    cac上下文的作用域鏈為:

    記憶體管理

    由於cac在包含它的函式外執行,對全域性作用域中的變數x 和 父函式中y存在這個引用,所以呢,x和y所佔的儲存空間不會被回收!

    綜上,閉包存在於函式中,它是作用域的一種現象!

  • 2 # 酷冰資訊分享

    簡單通俗易懂的講就是一個函數里面還有一個函式,然後這個內部函數里用到了外部函式的變數,這個內部函式就叫閉包。

    概念通俗易懂,不過也得注意其用途。

    它的最大用處有兩個,一個是前面提到可以讀取函式內部的變數,另一個就是讓這些變數的值始終保持在記憶體中。

    簡單解釋下這兩句話,我們在外部是無法訪問到函式內部的變數的,如果我們想要訪問,則可以透過在內部建立一個函式,也就是閉包來訪問這個函式,然後透過外部函式返回這個閉包,那我們在外部就可以透過這個閉包來訪問這個函式的內部變量了。

    接著上面的情況,如果這個閉包我們賦值在一個全域性變數上,那麼這個閉包就儲存在記憶體中,由於閉包訪問了它外部函式的變數,所以又依賴於它的外部函式,這個外部函式也就儲存在記憶體中,不會再呼叫結束後被垃圾回收機制回收。

  • 中秋節和大豐收的關聯?
  • 貨幣史就是通脹史,貨幣的本質就是通脹、就是貶值,是嗎?