常見(jiàn)的面試題什么是閉包
閉包是 JS 的一種 語(yǔ)法特性笛厦,其他語(yǔ)言也有這種特性
參考MDN上閉包的定義:
閉包(closure)是一個(gè)函數(shù)以及其捆綁的周邊環(huán)境狀態(tài)(lexical environment,詞法環(huán)境)的引用的組合康栈。換而言之递递,閉包讓開(kāi)發(fā)者可以從內(nèi)部函數(shù)訪問(wèn)外部函數(shù)的作用域。
重點(diǎn):閉包讓開(kāi)發(fā)者可以從內(nèi)部函數(shù)訪問(wèn)外部函數(shù)的作用域啥么。
舉個(gè)例子:
const add2 = function (){
var count = 0
return function add (){ // 訪問(wèn)了外部變量的函數(shù)
count += 1
console.log(count)
}
}()
add2() //1
add2() // 2
- 首先定義add2 是一個(gè)自動(dòng)執(zhí)行函數(shù)
- 自動(dòng)執(zhí)行函數(shù)內(nèi)部定義了局部變量 count
- 自動(dòng)執(zhí)行函數(shù)返回值是函數(shù) add
- add2() 就等于調(diào)用add函數(shù)登舞,所以打印結(jié)果為 1
- add2() 再次調(diào)用add函數(shù),所以打印結(jié)果為 2
我的理解
根據(jù)MDN 定義悬荣,閉包是一個(gè)函數(shù)以及其捆綁的周邊環(huán)境狀態(tài)的引用的組合菠秒。結(jié)合上面的例子閉包就是:
閉包 = 函數(shù) add + 自由變量 a,
注意:閉包既不是 函數(shù) add,也不是局部變量 a,而是二者組成的整體
閉包的優(yōu)點(diǎn)
- 避免全局污染
- 提供了對(duì)局部變量的間接訪問(wèn)
- 維持變量践叠,使其不被垃圾回收
閉包的缺點(diǎn)
- 使用不當(dāng)會(huì)造成內(nèi)存溢出言缤,所以少用閉包