之前在學(xué)編譯原理的時(shí)候接觸過(guò)閉包這個(gè)概念,就是一組數(shù)據(jù)中所有數(shù)據(jù)的任意組合為閉包,然而突然看到與匿名函數(shù)放在一起了,感覺(jué)應(yīng)該不是那個(gè)意思,所以就了解了一下。
匿名函數(shù)就是沒(méi)有名字的函數(shù),閉包是可訪問(wèn)一個(gè)函數(shù)作用域里變量的函數(shù)。
匿名函數(shù)
- 一般函數(shù)的創(chuàng)建:
function a(){
return 1;
}
- 匿名函數(shù)的創(chuàng)建:
匿名函數(shù)有兩中創(chuàng)建方式,第一種就是將它賦值給一個(gè)變量:
var b = function(){
return 1;
}
第二種可以用自執(zhí)行的方法:
(function(){
return 1;
})()
匿名函數(shù)最大的用途是創(chuàng)建閉包(這是JavaScript語(yǔ)言的特性之一),并且還可以構(gòu)建命名空間,以減少全局變量的使用。
閉包
創(chuàng)建閉包的常見(jiàn)的方式,就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù),通過(guò)另一個(gè)函數(shù)訪問(wèn)這個(gè)函數(shù)的局部變量。
function a(){
var name='hello world';
return function (){ //通過(guò)匿名函數(shù)返回a()局部變量
return name;
}
}
- 使用閉包的好處:
1 . 使用閉包可以把局部變量駐留在內(nèi)存中,可以避免使用全局變量。
2 . 加強(qiáng)封裝性,可以達(dá)到對(duì)變量的保護(hù)作用。 - 使用閉包的缺點(diǎn):
1 . 由于閉包內(nèi)部變量?jī)?yōu)先級(jí)高于外部變量,所以多查找作用域鏈中的一個(gè)層次,就會(huì)在一定程度上影響查找速度。
2 . 由于閉包里作用域返回的局部變量資源不會(huì)被立刻銷(xiāo)毀回收,所以可能會(huì)占用更多的內(nèi)存。
過(guò)度使用閉包會(huì)導(dǎo)致性能下降,所以還是慎用吧。