您好,登錄后才能下訂單哦!
這篇文章主要講解了“分享js閉包”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“分享js閉包”吧!
## 閉包
閉包是一個能讀取其他函數(shù)內(nèi)部變量的函數(shù):
1. 閉包是一個函數(shù)
2. 這個函數(shù)能讀取到其他函數(shù)內(nèi)部的變量(局部變量)
3. 他能讓讀取到的變量始終保存在內(nèi)存中
## 閉包的缺陷:
閉包函數(shù)讀取到的變量會一直保存在內(nèi)存中,不做處理地盲目使用很容易有內(nèi)存泄漏(內(nèi)存未釋放或無法釋放所造成的內(nèi)存浪費,導(dǎo)致程序運行速度減慢)的風(fēng)險
## 案例
說了一堆,來點干貨
這個是從網(wǎng)上看到的一個案例
```
function fun(n,o){
console.log(o);
return {
fun: function(m){
return fun(m,n);
}
};
}
var a = fun(0); // ?
a.fun(1); // ?
a.fun(2); // ?
a.fun(3); // ?
var b = fun(0).fun(1).fun(2).fun(3); // ?
var c = fun(0).fun(1); // ?
c.fun(2); // ?
c.fun(3);
```
當(dāng)時我把代碼粘過來,邊看程序邊分析,把每一塊分析的過程都寫了下來
```
function fun(n, o) {
console.log(o);
return { // 這里返回一個對象,對象有個fun函數(shù)
fun: function (m) { // 函數(shù)返回 調(diào)用fun 函數(shù)的返回值
return fun(m, n);
}
};
}
var a = fun(0); // ? 傳參時只傳了,所以n是,o為 undefined;a即為fun返回的對象
// a.fun() 就是閉包函數(shù),var a = fun(0)中的 n=0,o=undefined 都會常駐在內(nèi)存中
a.fun(1); // ? 重新調(diào)用fun(n, 0),m = 1,n = 0,console.log(o),結(jié)果為
a.fun(2); // ? 0
a.fun(3); // ? 0
var b = fun(0).fun(1).fun(2).fun(3); // ? 0 1 2
// 1. fun(0)為對象,此時的n = 0,o = undefined,輸出 undefined
// 2. 然后調(diào)用對象的fun(m),m = 1,返回值為調(diào)用外部fun(n, o)的返回值,n = 1, o = 0 而這個返回值又是一個對象,輸出
// 3. 然后又調(diào)用對象的fun(m),m = 2,返回值為調(diào)用外部fun(n, o)的返回值,n = 2, o = 1 而這個返回值又是一個對象,輸出1
// 4. 然后又調(diào)用對象的fun(m),m = 3,返回值為調(diào)用外部fun(n, o)的返回值,n = 3, o = 2 而這個返回值又是一個對象,輸出2
// 這里指的注意的是每次的n和o的值都不一樣,是因為他們分別在不同的函數(shù)作用域內(nèi),這里每次都調(diào)用了一個新的fun(),開辟了一塊新空間
var c = fun(0).fun(1); // ? undefined,
// 而這里兩次的結(jié)果都是1,因為他們都是通過c這個對象調(diào)用的,就是說因為他們都在同一個函數(shù)作用域內(nèi)
c.fun(2); // ? 1
c.fun(3); // ? 1
```
分析的過程簡直是一場頭腦風(fēng)暴,稍不留神就會跑偏,總算寫完之后趕緊去對照他的答案(當(dāng)時并沒有跑一遍程序),結(jié)果發(fā)現(xiàn)`var b = fun(0).fun(1).fun(2).fun(3);`這里答案不一樣,他給的答案是`undefined, 0, 0, 0`,而我得到的結(jié)果是`undefined, 0, 1, 2`,我就又回頭看了一遍,覺得自己分析的沒問題啊,這時候突然想到我還沒跑一遍試試,于是抓緊跑一波,結(jié)果果然是站在我這邊的。
感謝各位的閱讀,以上就是“分享js閉包”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對分享js閉包這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。