我正在关注Tyler McGinnis的关于执行上下文,调用堆栈和闭包的教程。
https://www.youtube.com/watch?v=Nt-qa_LlUH0&feature=emb_title
我对闭包示例有些困惑。我知道闭包是当一个函数在另一个函数内部时。我也了解内部函数可以访问父函数参数(如视频中所述)。
我的困惑是在下面的代码中,是在调用makeAdder(5)时是否在第一次调用时也未调用内部函数?泰勒(Tyler)似乎建议第一次调用makeAdder时将其从调用堆栈中弹出,而无需更改内部函数。
当我们调用add5(2)时,我不明白的第二部分是调用makeAdder(5)否?当父函数仅接受一个参数时,如何添加两个参数?
如果有人可以逐步介绍如何调用它,那就太好了!
var count = 0;
function makeAdder(x) {
return function inner(y) {
return x + y;
}
}
var add5 = makeAdder(5);
console.log(add5); // what the call to makeAdder returns
count += add5(2);
console.log(count);
最佳答案
调用makeAdder(5)
时,内部函数在第一次调用时是否也未调用?
不,不是。那时仅调用makeAdder
,而makeAdder
本身未进行任何调用。它仅返回一个对象,而该对象恰好是一个函数。返回函数无需实际调用即可完成。
当我们调用add5(2)
时,这是在调用makeAdder(5)
吗?
它不调用makeAdder(5)
。 add5
的早期版本是调用makeAdder(5)
的结果,因此add5
是该内部函数。此处发生的特殊情况是,当您调用add5
时,将还原“执行上下文”,该上下文表示makeAdder
返回函数时的状态。这实际上意味着,当add5
(内部函数)引用x
变量时,它将在x
中找到先前调用makeAdder
时所具有的值。
当父函数仅接受一个参数时,如何添加两个参数?
的确,当我们调用父函数时,第二个参数尚不知道,并且此时我们不需要知道它,因为那时内部函数尚未执行。调用父函数的重要之处在于,我们建立了x
的值,即使只能通过调用内部函数来访问它,它也会“存在”。
当我们调用内部函数时,我们提供了所需的第二个参数。然后,内部函数可以将其对x
值(当我们进行父调用时提供)的“魔术”引用与它自己接收的常规参数结合起来。
关于javascript - 基本闭包示例混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59515193/