javascript 閉包是怎麼回事?

時間 2021-05-31 04:38:09

1樓:Mine Allen

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

也就是說,【閉包】是乙個函式,這個函式可以有權訪問另乙個函式作用域中的變數。

建立閉包的常用方法就是:在乙個函式內部建立另乙個函式。

為什麼要說一下閉包呢?因為閉包和作用域鏈有著親密關係。(逃

閉包之所以能夠訪問上一級函式的變數,就是因為有作用域鏈的存在。

一般來講,當函式執行完畢後,區域性環境的活動物件就會被銷毀,記憶體中僅儲存全域性執行環境(全域性執行環境的變數物件)。但是,閉包的情況又有不同。

在另乙個函式內部定義的函式會將其包含函式(外部函式)的活動物件新增到它的作用域鏈中。

上面那句話有點拗口,我們舉個例子:我們函式A中定義了乙個函式B,函式B會把其外部函式(即函式A)的活動物件,加入到自己作用域鏈中。另外當函式A執行完畢後,函式A的活動物件也不會被銷毀,因為函式B的作用域鏈仍然引用著函式A的活動物件,隨著函式B的作用域鏈被銷毀,函式A的活動物件才會被銷毀。

要理解閉包,還需要理解一下作用域和作用域鏈。

詳細看:js作用域總結

2樓:茄果

閉包無所不在,甚至可以說函式就是閉包。可以看看我寫的這篇文章,應該很好理解閉包的基本含義,至於應用就看個人了。http://www.

3樓:花生Peadar

其實我覺得閉包簡單來說就是子函式可以向上讀取父元素的變數,並且!一旦父函式的變數有所改變,子函式的讀取也會改變。

再就是涉及到this來解決閉包的變數讀取

4樓:simon song

閉包不是js自身的乙個特性嗎?函式內部定義的函式,及時外部函式執行完畢,內部函式仍能訪問父函式,也就是那個外部函式的產量。

5樓:野山椒雞雜

乙個定義在函式(A)內部的函式(B),通過訪問這個內部函式(B)來獲取函式(A)內部的變數,函式(B)就是閉包/***閉包本身就是一種函式***/。閉包就是用來連線函式(A)內部與外部的橋梁。

6樓:高階王尼瑪

我給個好理解的答案,手機碼字。

js裡每個函式都有乙個作用域,而函式又能在函式裡定義,就好像地球在太陽系,太陽系又在銀河系,全域性就是宇宙了。從地球能看到太陽,就像內部定義的函式能訪問外部函式定義的變數一樣。在js裡,外部函式通常無法訪問內部函式定義的變數,凡是打破這個規則的就是閉包。

在外太空,通過閉包才能看到地球。

7樓:manxisuo

更新:我在SegmentFault上回答了乙個關於閉包的問題。請參考:

segmentfault.com/q/1010000004140838/a-10200000041411171. 通常,函式中定義的區域性變數,在函式呼叫完成退出時會被清理掉---即不可訪問了。

2. 但是由於某種原因,在退出函式時這個變數無法被清理---因為它仍然可以通過某種方式訪問。

3. 結果是這個變數被以某種方式存在記憶體中,即閉包。

簡單說就是:乙個函式的區域性變數在函式呼叫完成後,居然還沒有死掉,它以某種形式頑強地活了下來,這種形式就是閉包。

8樓:Belleve

講清楚,好,請看(不太完整的)CEK 改寫語義:

函式呼叫行為:

\!>\!=k, t\rangle" eeimg="1"/>

\!>\!=k,t\rangle \rightarrow \langle \mathbf\ a,(e,s),(\mathbf\ f\ \#)>\!

>\!=k, t\rangle" eeimg="1"/>

\!>\!=k, t\rangle \rightarrow \langle b, \mathbf(p,b,e,s,a,k), k,t\rangle" eeimg="1"/>

deriv會產生乙個新的 (e', s') 對,棧幀 e' 的 upvalue 為 e 並且包含函式體 b 中的區域性變數表和形式參數列 p,堆 s' 會分配新的記憶體位置放置實際參數列 a 中的各項,然後設定 e' 的返回 continuation 為 k。)

\!>\!=k, t\rangle \rightarrow \langle \mathbf\ x, (e,s), k,t\rangle" eeimg="1"/>

函式定義行為:

closure是個比較簡單的三元組構造)

JavaScript 閉包都會記憶體洩露嗎?

愚希 element 會一直存在 function bindEvent element,a,b element null 這樣就解決了 Norkin 題主提出的這個問題很好,一方面作為IT人員,我們應該謹慎對待關乎效能的問題,盡量做到事前處理而非事後諸葛亮,否則,會增加處理的難度 另一方面,這些看起...

javascript的閉包的概念和ruby的閉包的概念有何異同?

蛙二 概念沒區別,但實現手法有小區別。很多語言 除JS,還有Lua,Scheme 實現閉包的詞法定界,會沿著作用域鏈一層層向上查詢,並把這個詞法範圍內的變數在閉包中另存乙份實體 非引用 而Ruby的作用域規則不允許鏈式地向作用域外查詢,只有用define method消除作用域牆,使原本隔離開的作用...

什麼是閉包?

吻住我的香腸嘴 當乙個函式執行的時候,需要訪問當前函式所在活動物件的上層活動物件 且上層活動物件不是全域性物件 的值物件的值的時候,這個時候就會產生乙個閉包。如果訪問的值乙個在上層活動物件的值物件中,還有乙個在上上層活動物件的值物件中的話,就會產生兩個閉包。簡而言之,閉包只有在函式呼叫時,且需要訪問...