當(dāng)函數(shù)可以記住并訪問所在的詞法作用域時澜建,就產(chǎn)生了閉包,即使函數(shù)是在當(dāng)前詞法作用域外執(zhí)行月帝。
當(dāng)某個函數(shù)持有對定義該函數(shù)的作用域(及其外部作用域)的引用搅荞,使得該作用域一直存活红氯,這個引用就叫閉包。
eg:回調(diào)函數(shù)
var a=2;
(function IIFE(){
console.log(a);
})();
該IIFE是閉包嗎咕痛?
存在爭議脖隶,按之前定義來講不屬于,因為該函數(shù)實在它定義的作用域中被執(zhí)行暇检,a變量是通過普通的詞法作用域查找而非閉包發(fā)現(xiàn)的。
常用循環(huán)調(diào)用異步函數(shù)方法
for(var i=1;i<=5;i++){
(function(j){
setTimeout(function timer(){
console.log(i);
},i*1000)
})(i);
}
還可以依賴let在for循環(huán)中的特殊行為:變量在循環(huán)過程中每次迭代都會被聲明婉称。
for(let i=1;i<=5;i++){
setTimeout(function timer(){
console.log(i);
},i*1000)
}