闭包

184 阅读1分钟

含义

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

原因

内部的函数存在外部作用域的引用就会导致闭包

作用

  • 保护函数的私有变量不受外部的干扰,形成不销毁的栈内存
  • 把一些函数内的值保存下来,闭包可以实现方法和属性的私有化

缺点

函数变量一直保存在内存中,过多的闭包会发生内存泄漏

(内存泄露四种方式:意外的全局变量、被遗忘的setInterval或回调函数、脱离DOM的引用、闭包)

场景

  • 原生的setTimeout传递的第一个函数不能带参数,通过闭包可以实现传参效果

    setTimeout(function(param){
        alert(param)
    },1000)
    
    //通过闭包可以实现传参效果
    function func(param){
        return function(){
            alert(param)
        }
    }
    var f1 = func(1);
    setTimeout(f1,1000);
    
  • 节流防抖

  • for循环赋值

  • 柯里化函数

面试题

  • for 循环和闭包
  •     //这里的 i 是全局下的 i,共用一个作用域,当函数被执行的时候这时的 i=3,导致输出的结构都是3。
        var data = [];
        for (var i = 0; i < 3; i++) {
            data[i] = function () {
                console.log(i);
            };
        }
        data[0]();
        data[1]();
        data[2]();
        /* 输出
            3
            3
            3
        /
      
      //自执行函数和闭包var data = [];
      for (var i = 0; i < 3; i++) {
          (function(j){
            setTimeout( data[j] = function () {
              console.log(j);
            }, 0)
          })(i)
      }
      data[0]();
      data[1]();
      data[2]();
      /* 输出
          0
          1
          2
      /
      
      //let 具有块级作用域,形成的3个私有作用域都是互不干扰的。
      var data = [];
      for (let i = 0; i < 3; i++) {
        data[i] = function () {
          console.log(i);
        };
      }
      data[0]();
      data[1]();
      data[2]();
      /* 输出
          0
          1
          2
      /