快速理解“闭包”

看了好多讲解,大部分都是从官方的概念上绕来绕去。。甚至于有些讲解的易懂程度还不如维基百科。在通过各种方法,最终勉强算是理解之后,我觉得还是写一个小小的博客,方便自己回顾,也方便一下和我一样赶鸭子上架的小伙伴们。

举例说明

例1

function outerFunction(x) {
  function innerFunction(y) {
    return x + y;
  }
  return innerFunction;
}

let add5 = outerFunction(5); // 返回一个闭包函数
let add10 = outerFunction(10); // 返回另一个闭包函数

console.log(add5(2)); // 输出 7
console.log(add10(2)); // 输出 12

1.首先,定义一个名为outerFunction的外部函数,它接受一个参数x。在outerFunction内部,定义了一个名为innerFunction的内部函数,它可以访问并使用x参数。然后,将innerFunction作为outerFunction的返回值。

2.接下来,调用outerFunction(5),它返回innerFunction,并将其赋值给add5。此时,add5函数的参数x被设置为5。

3.然后,再次调用outerFunction(10),它返回innerFunction,并将其赋值给add10。此时,add10函数的参数x被设置为10。

4.分别调用add5和add10函数。实际上,这两个函数都是innerFunction的闭包实例,它们的参数值x不同。当我们调用add5(2)时,它返回x + y的结果,即5 + 2,输出7。当调用add10(2)时,它返回x + y的结果,即10 + 2,输出12。

这个例子展示了如何使用闭包创建多个加法器函数,它们可以记住并访问其创建时的参数。尽管outerFunction已经执行完毕,但由于闭包的特性,innerFunction仍然可以访问x参数。

例2

def outer_function(name):
    greeting = f"Hello, {name}!"

    def inner_function():
        print(greeting)

    return inner_function

# 调用outer_function,返回值是inner_function
closure_example = outer_function("Alice")

# 调用closure_example,实际上是调用inner_function
closure_example()  # 输出 "Hello, Alice!"

在这个示例中,首先定义一个名为outer_function的外部函数,它接受一个参数name。在outer_function内部,定义一个字符串变量greeting,包含对name的问候。然后定义了一个名为inner_function的内部函数,它可以访问greeting变量。

接着,将inner_function作为outer_function的返回值。当调用outer_function并传入参数"Alice"时,它返回inner_function,并将其赋值给closure_example。

最后,调用closure_example(即inner_function)。由于闭包的特性,inner_function能够访问并输出greeting变量,即使outer_function已经执行完毕。

这个例子再次展示了闭包如何使内部函数能够访问和操作外部函数的作用域,即使外部函数已经执行完毕。

较为官方的描述

闭包(Closure)是编程中的一个概念,它允许一个函数访问并操作其外部作用域(enclosing scope)中的变量,即使外部函数已经执行完毕。闭包实际上是一个函数和它相关的引用环境(lexical environment)的组合。

闭包的主要特点是:

  1. 一个函数内部定义另一个函数。
  2. 内部函数可以访问外部函数的变量和参数。
  3. 外部函数返回内部函数,使其具有访问外部函数作用域的能力。

你可能感兴趣的:(前端,javascript,开发语言)