我正在关注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/

10-13 08:59