遞歸
遞歸指函數(shù)自己調(diào)用自己
閉包指的是被函數(shù)分割形成的作用域,從而形成被保護(hù)的私有數(shù)據(jù)晃危,這個(gè)被我們稱(chēng)之為閉包叙赚。在我們平常很少使用遞歸去計(jì)算,遞歸的消耗性能不可忽視僚饭,在計(jì)算比較小的值的時(shí)候我們可以忽略震叮。
當(dāng)然我們?cè)谑褂玫臅r(shí)候需要注意一些問(wèn)題:
1.自己調(diào)用自己就相當(dāng)于循環(huán),以此達(dá)到一些便利鳍鸵。
2.我們?cè)谑褂眠f歸時(shí)候必須要有跳出的條件苇瓣,不然就會(huì)出現(xiàn)死遞歸。
斐波拉切數(shù)列:
var fib = function ( n ) {
if ( n === 0 || n === 1 ) return 1;
return fib( n - 1 ) + fib( n - 2 );
};
閉包
要理解閉包偿乖,首先必須理解javascript特殊的變量作用域
1.全局作用域:在函數(shù)內(nèi)外都能訪(fǎng)問(wèn)击罪。
2.局部作用域:函數(shù)內(nèi)部可以直接讀取全局變量哲嘲,函數(shù)外部無(wú)法訪(fǎng)問(wèn)函數(shù)內(nèi)部的局部變量。
由于在Javascript語(yǔ)言中媳禁,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量眠副,因此可以把閉包簡(jiǎn)單理解成"定義在一個(gè)函數(shù)內(nèi)部的函數(shù)"。
所以說(shuō)竣稽,在本質(zhì)上囱怕,閉包就是將函數(shù)內(nèi)部和函數(shù)和函數(shù)外部鏈接起來(lái)的一座橋梁。
接下來(lái)我們來(lái)看一段代碼:
const Greeters = []
for (var i = 0 ; i < 10 ; i++) {
Greeters.push(function () { return console.log(i) })
}
Greeters[0]() // 10
Greeters[1]() // 10
Greeters[2]() // 10
雖然期望輸出0,1,2,…毫别,然而實(shí)際上卻不會(huì)娃弓。