我在返回
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()
你的
first()
函数返回一个函数(second()
)。因此,变量 fn
被初始化为将返回的函数作为其值。
因为
fn
是一个函数,要从中获取值 fn
必须作为函数调用,fn()
。没有()
,它只是对函数的引用。调用函数使它做它做的事情,在这种情况下是增加这些变量并将值记录到控制台。
如果你写了
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)
传递