什么是闭包

58 阅读1分钟

闭包是指有权访问另一个函数作用域中的变量的函数。 子函数可以访问函数的变量

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