当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域外执行。
当某个函数持有对定义该函数的作用域(及其外部作用域)的引用,使得该作用域一直存活,这个引用就叫闭包。
eg:回调函数
var a=2;
(function IIFE(){
console.log(a);
})();
该IIFE是闭包吗?
存在争议,按之前定义来讲不属于,因为该函数实在它定义的作用域中被执行,a变量是通过普通的词法作用域查找而非闭包发现的。
常用循环调用异步函数方法
for(var i=1;i<=5;i++){
(function(j){
setTimeout(function timer(){
console.log(i);
},i*1000)
})(i);
}
还可以依赖let在for循环中的特殊行为:变量在循环过程中每次迭代都会被声明。
for(let i=1;i<=5;i++){
setTimeout(function timer(){
console.log(i);
},i*1000)
}