一个函数,并且这个函数可以访问到外部函数的变量,这样就形成了一个闭包。

闭包有以下几个作用:

封装变量:通过闭包,我们可以将一些变量封装在函数内部,避免污染全局作用域。这种方式也被称为模块模式。

保护变量:由于闭包内部的变量只能通过闭包内部的函数访问,因此可以保护这些变量,避免被外部误操作。

延长变量声明周期:如果一个变量在函数执行完毕后就被销毁了,但是如果这个变量被闭包引用了,那么这个变量就会一直存在,直到闭包被销毁。

实现回调和异步操作:通过闭包,我们可以将一个函数作为参数传递给另一个函数,用于回调或异步操作。

需要注意的是,闭包也有一些潜在的问题,如内存泄漏等。因此,在使用闭包时需要谨慎,合理使用。

有关闭包的代码

计数器

function counter() {
  let count = 0;
  return function() {
    count++;
    console.log(count);
  }
}

const c = counter();
c(); // 1
c(); // 2
c(); // 3

私有变量

function Person(name) {
  let _age = 0;

  function setAge(age) {
    _age = age;
  }

  function getAge() {
    return _age;
  }

  return {
    name: name,
    setAge: setAge,
    getAge: getAge
  }
}

const person = Person("John");
person.setAge(30);
console.log(person.getAge()); // 30

模块提升

const module = (function() {
  let privateVar = "I'm private";
  let publicVar = "I'm public";
  function privateFunc() {
    console.log("I'm private func");
  }
  function publicFunc() {
    console.log("I'm public func");
  }
  return {
    publicVar: publicVar,
    publicFunc: publicFunc
  }
})();

console.log(module.publicVar); // "I'm public"
module.publicFunc(); // "I'm public func"