闭包是指有权访问另一个函数作用域中的变量的函数。 子函数可以访问函数的变量
1、优点
- 可以读取函数内部的变量,在任何地方使用,可以实现变量共享
- 可以封装私有变量,减少全局变量
2、缺点
- 暴露函数内部的变量可以访问和修改
- 使用闭包的时候原函数不会被回收,会常驻内存,如果大量使用可能会导致性能问题,所以在使用完毕之后可以手动释放
例子:
function fun(n,o) {
console.log(o)
return {
fun:function(m){
return fun(m,n);
}
};
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3);//undefined,0,0,0
var b = fun(0).fun(1).fun(2).fun(3);//undefined,0,1,2
var c = fun(0).fun(1); c.fun(2); c.fun(3);//undefined,0,1,1
//除了fun(0)调用的是第一层,其余调用的是第二层fun
//常见的定时器问题
for( var i = 0; i < 5; i++ ) {
setTimeout(() => {
console.log( i );
}, 1000)
}
//得到结果 5个5
//setTimeout函数在当前执行队列的最后执行,获取到的i是最外部作用域的i=5,所以得到5个5
//那么如果想1s后得到0-4怎么做?在for循环内创建闭包
for (var i = 0; i < 5; i++) {
(function(j) {
setTimeout(function() {
console.log(j);
},1000)
})(i)
}
//同样setTimeout在执行队列的最后执行,获取到的j是外部函数的j,由于闭包中的变量会保存下来,每一次获取的j分别是0,1,2,3,4