理解函数返回的闭包

问题描述 投票:0回答:2

我在返回

second
时理解有问题(第 8 行)。是不是还给
first
?为什么我需要在这样做后首先使用括号和我分配给的变量?例如:
fn()
。为什么我不能只使用
fn

function first() {
  let a = 0
  let b = 10

  function second() {
    a++
    b++
    console.log(a, b)
  }
  
  return second
}

const fn = first()

fn()
fn()

javascript closures
2个回答
0
投票

你的

first()
函数返回一个函数(
second()
)。因此,变量
fn
被初始化为将返回的函数作为其值。

因为

fn
是一个函数,要从中获取值
fn
必须作为函数调用
fn()
。没有
()
,它只是对函数的引用。调用函数使它做它做的事情,在这种情况下是增加这些变量并将值记录到控制台。


0
投票

如果你写了

const fn = first
fn
就会成为函数
first
的别名。

相反,函数

first
返回
second
,这是在
first
中定义的局部函数,它访问当前调用中的局部变量
a
b
。这创建了一个特殊的东西来捕获这些变量,允许它们在退出函数
first
调用时继续存在。这个东西叫做closure。它的行为类似于函数
second
,但指的是特定的变量集
a
b
来自对返回闭包的
first()
的原始调用。

按照编码,

const fn = first()
定义了一个变量
fn
初始化为调用函数
first()
的返回值,它是函数
second
的闭包,函数调用
first()
捕获的变量('a' 和'b').

每次调用

fn()
,捕获中的局部变量
a
b
都会递增,并将它们的值写入控制台。

这些变量只能通过这个特定的函数闭包访问

second
。再次调用
first()
将返回一个不同的闭包,其变量
a
b
初始化为
0
.

如果你只是写了

fn
而没有
()
,它不会做任何事情。你必须使用
()
call 闭包,就像函数一样。如果函数
second
在其定义中采用了 2 个参数,您可以将它们作为
fn(1, 2)

传递
© www.soinside.com 2019 - 2024. All rights reserved.