閉包理解
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 閉包的好處 將乙個變數長期駐紮在記憶體中 ...