深入了解闭包

本文深入探讨了JavaScript中的闭包概念,解释了它如何让内层函数访问外层作用域。通过多个示例展示了闭包在封装、数据隐藏、函数工厂等方面的应用,以及在内存管理和模块化中的重要性。同时,提到了闭包在防止全局变量污染和实现私有属性上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        MDN对于闭包的解释是: 一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。

当一个函数被创建出来时,闭包也随之产生,一个函数和他的作用域捆绑在一起这种现象就是闭包,提到闭包那就不得不提起作用域链、[[scope]]

global scope=>闭包,闭包函数,并不是一定要访问作用域的内容。

function test () {
  // fn test1 + test scope => 闭包,test1 就叫做闭包函数
  function test1 () {
    // closure 
  }
}
function test () {
  var a = 1;
  // fn test1 + test scope => 闭包,test1 就叫做闭包函数
  function test1 () {
    // closure 
    console.log(a);
  }
}

没有形成闭包,function b没有和test的环境捆绑,所以不是闭包

function b () {
  console.log(a);
}
function test () {
  var a = 1; 
  b(a);
}
test();

函数内部声明函数,其实就是一种封装性

function compute () {
  function plus (a, b) {
    return a + b;
  }
  function minus (a, b) {
    return a - b;
  }
  function mul (a, b) {
    return a * b;
  }
  function div (a,b ) {
    return a / b;
  }
  return function (type, a, b) {
    switch (type) {
      case 'plus':
        return plus(a, b);
      case 'minus':
        return minus(a, b);
      case 'mul':
        return mul(a, b);
      case 'div':
        return div(a, b);
      default:
        break;
    }
  }
}
console.log(compute()('mul', 100, 200));

==》

function compute () {
  compute.plus = function (a, b) {
    return a + b;
  }  
  compute.minus = function (a, b) {
    return a - b;
  }
  compute.mul  = function (a, b) {
    return a * b;
  }
 
  compute.div  = function (a, b) {
    return a / b;
  }
  return function (type, a, b) {
    return compute[type](a, b);
  }
}
console.log(compute()('mul', 100, 200));

==》

function compute (type, a, b) {
  compute.plus = function (a, b) {
    return a + b;
  }
  compute.minus = function (a, b) {
    return a - b;
  }
  compute.mul  = function (a, b) {
    return a * b;
  }
  compute.div  = function (a, b) {
    return a / b;
  }
  return compute[type](a, b);
}
console.log(compute('mul', 100, 200));

闭包可以来做数据结构化,比如请求一组数组,在函数中声明其他函数进行数据处理,再返回处理后的数据

class Compute {
  constructor () {
    this.a = 100;
  }
  add (b) {
    return this.a + b;
  }
  minus (b) {
    return this.a - b;
  }
}
const compute = new Compute();
console.log(compute.add(10));

上面的代码存在一个问题,a是内部变量,我们仍然可以访问,这时候需要用到闭包

const Compute = (function () {
  const a = 100;
  return class Compute {
    add (b) {
      return a + b;
    }
    minus (b) {
      return a - b;
    }
  }
})();
const compute = new Compute();
console.log(compute.add(10));

闭包缓存内部变量,不会污染全局,每个实例都存在自己的私有属性

function test () {
  let a = 1;
  function b () {
    return ++a;
  }
  return b;
}
const b = test();
console.log(b()); // 2
console.log(b()); // 3
console.log(b()); // 4

闭包应用案例

function compute () {
  const base = 1000;
	return {
    plus: function (a, b) {
      return base +  a + b;
    },
    minus: function (a, b) {
      return base -  a - b;
    },
    mul: function (a, b) {
      return base *  a * b;
    },
    div: function (a, b) {
      return base /  a / b;
    }
  }
}
const comp = compute();
console.log(comp.plus(1, 2));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值