闭包

103 阅读1分钟

什么是闭包

闭包代码示例:

function f1(){
    let a =1
    function f2(){
        console.log(a)
    }
    f2()
}
f1()

由于f2函数并没有声明变量a,而是引用了f1函数中声明的变量a,这种内部函数与外部变量一起构成闭包,即闭包可以让你从内部函数访问到外部函数作用域。

闭包的用途是什么

js可以用闭包模拟私有方法,代码示例:

let f1 =function(){
    let a =1
    function f2(x){
        a+=x
    }
    return {
        add:function(){
            f2(1)
        },
        mins:function(){
            f2(-1)
        },
        value:function(){
            return a
        }
    }
}
let a1 = f1()
let a2 = f1()
a1.add()
a1.add()
a1.value()
a2.value()

image.png
由图片可知,a1和a2引用的都是自己词法作用域内的变量a,所以有利于对限制对代码的访问,也保证了非核心方法弄乱代码的公共借口部分,此外对于for和setTimeout的经典问题,使用闭包也是可以解决这个问题的,用闭包保存变量i,然后将setTimeout放入立即执行函数中,将for循环中的循环值i作为参数传递,代码如下:

for (var i = 0; i < 6; i++) { 
  (function(i){ 
    setTimeout(function (){
      console.log(i)
     },0)
  })(i)
}

image.png
因此,闭包可以维持一个变量,可以做缓存

闭包的缺点是什么

  1. 由于私有变量不能销毁,所以会增大内存消耗
  2. 由于闭包涉及到跨域访问,所以会影响性能