Skip to content

闭包是什么,有什么特性?有什么负面影响?

回顾

  • 回顾:作用域和自由变量
  • 闭包应用场景:函数作为参数被传入,函数作为返回值被返回
  • 回顾:自由变量的查找,要在函数定义的地方(而非执行的地方)
  • 影响:变量会常驻内存,得不到释放。闭包不要乱用
js
// 自由变量示例 - 内存会被释放
let a = 0;
function fn1() {
  let a1 = 100;
  function fn2() {
    let a2 = 200;
    function fn3() {
      let a3 = 300;
      return a + a1 + a3 + a3;
    }
  }
  fn2();
}
fn1();
// 闭包 函数作为返回值 - 内存不会被释放
function create() {
  let b = 100; // b 被返回,暂时不会释放
  return function () {
    console.log(b);
  };
}
let fn2 = create();
let b = 200;
fn2(); // 100
// 闭包 函数作为参数 - 内存不会被释放
function print(fn) {
  let c = 200;
  fn();
}
let c = 100; // b 被传入,暂时不会释放
function fn3() {
  console.log(c);
}
print(fn3); // 100

基于 MIT 许可发布