JS閉包理解

2022-03-17 15:29:43 字數 912 閱讀 3318

接觸js很久了,一直對於閉包的概念不理解,因為平時很少會用到,所以找了一下資料看了一下,簡單記一下筆記,不對之處望指正。

先來看乙個簡單列子:

function f1()

return f2;

}var f1pro=f1();

alert(f1pro());//-----2

alert(f1pro());//------3

對輸出結果進行分析,如果我們忽略f2函式部分,那麼我們會很容易判斷為兩次輸出都是2,原因是因為v1是f1函式的區域性變數,區域性變數是會在函式呼叫結束以後被gc所自動**的,所以第二次f1函式的呼叫結果與第一次f1函式的呼叫結果是沒有關係的。

但是萬萬沒想到的是,第二次結果是3! 為什麼呢?  看上去v1被公升級成為了全域性變數。   其實事實和這種猜想是有所差別的。 事實上f2這個內部函式就是我們所說的閉包,而閉包的作用,有2個:1、訪問函式內部的區域性變數。2、將使用到的區域性變數的值儲存在記憶體中。 第乙個很好理解,將函式看成乙個class的話,就相當於類函式訪問到類變數,理所應當。而輸出結果為3,原因就在於f1是f2的父函式,而f2被賦給了乙個全域性變數(f1pro,因為f1返回的是f2函式,所以f1pro其實是指向了f2函式),依賴關係即:f1pro--》f2---》f1,根據js的gc**原理(如果乙個物件不再被引用,那麼這個物件就會被gc**。如果兩個物件互相引用,而不再被第3者所引用,那麼這兩個互相引用的物件也會被**),那麼在全域性變數f1pro被釋放之前,f1和f2函式都不會被垃圾**機制(garbage collection)**。

關於閉包的應用場景,我的理解是,當我需要讓乙個變數在函式外能夠被操作,並且我不想這個變數暴露在外,被任何人任意操作的時候,就可以用到閉包,這個時候這個變數就只能按照閉包裡函式的規則被獲取和修改。

值得注意的是,由於閉包繞過了gc處理,所以濫用的話,是會降低js執行效率,甚至造成記憶體溢位的。

JS閉包理解

下圖例項 body ul li 1 li li 2 li li 3 li ul body html script vara document.getelementsbytagname li for vari 0 i a.length i i 如何從外部讀取區域性變數 functionvisitinn...

JS閉包理解

js閉包理解 在很多面試題中都會問什麼是js的閉包,為什麼需要使用閉包,使用閉包的優缺點!我在面試其他人的時候也喜歡問這個問題,回答的也是千奇百怪,現在就總結一下我對閉包的理解。閉包是一種概念,這種概念比較複雜,很多地方的定義不盡相同,我的理解是 閉包是能讀取函式內部變數的函式,也就是定義在函式內部...

js閉包理解

什麼是閉包?這兩天我在網上翻閱了大量的閉包理解部落格,有優秀的也有生搬硬套的。歸根揭底,還是理解的問題。我曾經聽老師講閉包後,還是一臉疑惑,然後下課去網上查閱資料,仔細研究之後知道是裡面要套乙個函式返回父級變數。這次我就講解一下個人理解的閉包。為什麼會出現閉包?首先,我們先想下,我現在需要乙個一直用...