詳解JS閉包概念

2022-05-05 08:33:12 字數 4044 閱讀 3807

閉包理解

1.  如何產生閉包?

*當乙個巢狀的內部(子

)函式引用了巢狀的外部(父

)函式的變數(函式

)時,產生閉包

2.  閉包到底是什麼?

* 使用

chrome

除錯檢視

* 理解一:閉包是巢狀的內部函式

(絕大部分人

)* 理解二:包含被引用變數(函式

)的物件

(極少數人

)* 注意:閉包存在於巢狀的內部函式中

3.  產生閉包的條件?

* 函式巢狀

* 內部函式引用了外部函式的資料(變數

/函式)

* 執行函式定義

(比如執行外部函式時

)(執行函式定義就會產生閉包,不用呼叫內部函式,呼叫外部函式時會預處理產生執行上下文,那時就可以執行內部函式的定義了)

這種函式定義,在22行就已經產生閉包。

如果把函式定義賦給變數這種形式,在22行處就不能產生閉包,因為預處理時會把fn2當做變數提公升,賦值undefined,也沒有執行函式定義。也就無法產生閉包。

這種方式宣告的函式物件,要在26行整個函式定義執行完才會產生閉包。

常見的閉包

1. 將函式作為另乙個函式的返回值

2. 將函式作為實參傳遞給另乙個函式呼叫

看內部函式建立幾次,就看外部函式執行幾次。

反覆執行內部函式的過程中,閉包為什麼沒有消失?

如果沒有閉包,在執行完var f =fn1()後

a就消失了,後面的

f()沒法從

fn1裡面調

閉包裡面有msg,沒有

time

閉包的作用

1. 使用函式內部的變數在函式執行完後,仍然存活在記憶體中

(延長了區域性變數的生命週期)

2. 讓函式外部可以操作(讀寫

)到函式內部的資料(變數

/函式)

問題:

1. 函式執行完後,函式內部宣告的區域性變數是否還存在?

一般不存在,存在於閉包中的變數才可能存在。

(「可能」是指:閉包所在的函式物件不成為垃圾物件

)

按理說,函式執行完後其內部的屬性都會被釋放,但如果該函式的某個內部函式物件通過在外部函式內return的方式賦給某個全域性變數,

那麼這個函式物件就存活下來了,而和它有關聯的閉包裡的區域性變數也會存活。

2. 在函式外部能直接訪問函式內部的區域性變數嗎?

不能。但我們可以通過閉包來讓外部操作它。

(「通過閉包來讓外部操作」是指:函式巢狀乙個內部函式,在這個內部函式物件裡寫類似a++這種可以修改函式內部變數的操作,

然後把這個內部函式物件賦給外部的全域性變數,就可以在外部操作函式內部的區域性變數)

閉包的生命週期

1. 產生:在巢狀內部函式定義執行完時就產生了(不是在呼叫)

2. 死亡:在巢狀的內部函式成為垃圾物件時

閉包死亡(包含閉包的函式物件成為垃圾物件)

f = null

閉包應用_自定義

js模組

* 具有特定功能的

js檔案

* 將所有的資料和功能都封裝在乙個函式內部(私有的)

* 只向外暴露乙個包含

n個方法的物件或方法

* 模組的使用者,只需要通過模組暴露的物件呼叫方法來實現對應的功能

第一種

第二種

這種直接就可以呼叫,比第一種更方便。

另外,壓縮**時的細節,在頂部和底部的小括號寫成window。

就可以將所有window壓縮成

w。

閉包的缺點及解決

1. 缺點

* 函式執行完後,函式內的區域性變數沒有釋放,占用記憶體時間會變長

* 容易造成記憶體洩露

2. 解決

* 能不用閉包就不用

* 及時釋放

f = null  //讓內部函式成為垃圾物件

-->

**閉包

記憶體溢位與記憶體洩露

1.記憶體溢位

* 一種程式執行出現的錯誤

* 當程式執行需要的記憶體超過剩餘的記憶體時,就丟擲記憶體溢位的錯誤

2.記憶體洩露

* 占用的記憶體沒有及時釋放

* 記憶體洩露積累過多了就導致記憶體溢位

* 常用的記憶體洩露:

* 意外的全域性變數(函式內不加

var定義的變數)

* 沒有及時清理的定時器或**函式(啟動迴圈定時器後不清理)

* 閉包(沒有主動

f=null

讓內嵌的函式物件成為垃圾物件,閉包也會一直存在)

JS閉包詳解

1.先看看常見的例子吧 var fn null function foo fn innerfoo foo bar 下面我們通過斷點除錯的方法來看看執行順序 fn null foo foo 內部 a 2 fn innerfoo bar bar 內部 fn innerfoo 內部console.log ...

詳解js閉包

閉包 closure 是j ascript語言的乙個難點,也是它的特色,很多高階應用都要依靠閉包實現。閉包有三個特性 1.函式巢狀函式 2.函式內部可以引用外部的引數和變數 3.引數和變數不會被垃圾 機制 閉包是指有權訪問另乙個函式作用域中的變數的函式,建立閉包的最常見的方式就是在乙個函式內建立另乙...

js 閉包概念,用法

1 我們常說的閉包就是函式巢狀函式,內部函式可以引用外部函式的引數和變數 如下 2 會涉及到js中的垃圾 機制 指 當函式執行完時,函式的變數將會收回,閉包就不一樣了 如下 3 閉包中當外部函式載入完時,外部函式的變數內部函式還可以繼續使用,不會 如下 4 閉包的好處 將乙個變數長期駐紮在記憶體中 ...