閉包是由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體(wikipedia-閉包)
閉包由兩部分組成:一是函數(shù),二是與這個(gè)函數(shù)相關(guān)的引用環(huán)境,即函數(shù)及函數(shù)內(nèi)部能訪問到的變量組成了一個(gè)閉包
(function fn(){
var name="小明"
function showName(){
console.log(name)
}
showName()
})() //小明
函數(shù)fn是一個(gè)立即執(zhí)行函數(shù),變量 name 和函數(shù) showName() 就組成了一個(gè)閉包,這里變量 name 所在的上下文就是上文所說的引用環(huán)境。
對上面的立即執(zhí)行函數(shù)做一點(diǎn)改動(dòng):
function fn(){
var name="小明"
return function showName(){
console.log(name)
}
}
var yourName = fn()
yourName()
代碼改動(dòng)后,我們不在函數(shù)fn內(nèi)部調(diào)用函數(shù)showName(),而是將showName()函數(shù)作為fn函數(shù)的返回值返回出來,同時(shí),我們在函數(shù)外定義了一個(gè)變量yourName來引用函數(shù)fn(),因此yourName執(zhí)行時(shí)就相當(dāng)于fn()被調(diào)用,而showName()函數(shù)一樣需要調(diào)用其外部的變量name,因此函數(shù)showName()和變量name就組成了一個(gè)閉包。
- 閉包的作用
閉包可以間接的訪問一個(gè)變量,也就是可以使一個(gè)函數(shù)訪問到另一個(gè)函數(shù)內(nèi)部的變量。