📜  es6 闭包 - Javascript (1)

📅  最后修改于: 2023-12-03 15:00:37.293000             🧑  作者: Mango

ES6闭包

闭包是一个非常强大的概念,在JavaScript中被广泛使用。ES6引入了一些新特性,使得JavaScript中闭包的使用更加易于理解和实现。

什么是闭包?

闭包实际上是一个函数及其相关变量的组合,可以在函数内部定义另一个函数,并且内部函数可以访问外部函数的变量。

例如,以下的代码在内部函数中使用了外部函数中的变量:

function outerFunction() {
  const outerVariable = 'Hello!';

  function innerFunction() {
    console.log(outerVariable);
  }

  innerFunction();
}

outerFunction();

在以上例子中,innerFunction 可以访问 outerVariable,因为它定义在 outerFunction 内部。这样的 outerVariable 就是一个闭包。

如何创建闭包

在 ES6 中,有两种方式创建闭包:使用 Function.prototype.bind 和箭头函数。

使用 Function.prototype.bind

可以使用 Function.prototype.bind 来创建一个绑定函数。它是一个新函数,其 this 值被永久设置为绑定函数的第一个参数,而其他参数保持不变。绑定函数可以自己作为构造函数使用,调用时 this 不会改变。

const outerVariable = 'Hello!';

function outerFunction() {
  function innerFunction() {
    console.log(this.outerVariable);
  }

  const boundFunction = innerFunction.bind(this);

  boundFunction();
}

outerFunction.call({ outerVariable });

在此示例中,outerFunction 创建了一个 innerFunction,并将其绑定到外部 this 上。然后它调用了 boundFunction,该函数打印 this.outerVariable

使用箭头函数

箭头函数只有一个表达式,它的值被认为是函数返回值。箭头函数没有自己 this 值,它们继承了 this 值上下文,因此它们可以访问 this 值。

const outerVariable = 'Hello!';

function outerFunction() {
  const innerFunction = () => {
    console.log(this.outerVariable);
  }

  innerFunction();
}

outerFunction.call({ outerVariable });

在此示例中,outerFunction 创建了一个 innerFunction,它使用箭头函数定义。然后它调用了 innerFunction,该函数打印 this.outerVariable

使用闭包

闭包在编程中有很多用途。例如,可以使用闭包来创建私有变量:

function counter() {
  let count = 0;

  return () => {
    count += 1;
    return count;
  };
}

const c = counter();
console.log(c()); // 1
console.log(c()); // 2

在此示例中,counter 函数返回一个新函数。这个新函数是一个闭包,它引用了 count 变量。每次调用该函数时,它都会将 count 值加 1 并返回它。

结论

闭包是一种非常有用的编程概念,可以让开发人员编写更干净的代码,并创建强大的抽象。ES6 提供了多种方式来创建闭包,使得闭包在 JavaScript 中的使用更加容易和优雅。