基本闭包示例混淆

时间:2019-12-28 21:56:57

标签: javascript closures

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

2 个答案:

答案 0 :(得分:2)

  

在调用makeAdder(5)时,内部函数在第一次调用时是否也未调用?

不,不是。那时仅调用makeAdder,而makeAdder本身并未进行任何调用。它仅返回一个对象,而该对象恰好是一个函数。返回函数无需实际调用即可完成。

  

当我们打电话给add5(2)时,这是在调用makeAdder(5)吗?

它没有调用makeAdder(5)add5的早些时候是调用makeAdder(5)的结果,因此add5 是该内部函数。此处发生的特殊情况是,当您调用add5时,将还原“执行上下文”,该上下文表示makeAdder内部函数返回时的状态。这实际上意味着,当add5(内部函数)引用x变量时,它将在{{1 }}早已被调用。

  

当父函数仅接受一个参数时,如何添加2个参数?

确实,当我们调用父函数时,第二个参数尚不知道,并且此时我们不需要 知道,因为那时内部函数尚未执行时刻。调用父函数的重要之处在于,我们建立了x的值,即使只能通过调用内部函数来访问它,它也会“存在”。

当调用内部函数时,我们提供所需的 second 参数。然后,内部函数可以将其对makeAdder值(当我们进行父调用时提供)的“魔术”引用与它自己接收的常规参数结合起来。

答案 1 :(得分:0)

一种简单的方法是将其视为返回函数的函数-可以像正常函数一样调用它。因此,函数返回类型的第一个调用是一个函数。

看下面的例子

function add(x,y){
 return x+y;
}

function subtract(x,y) {
 return x-y;
}

function calculator(type){
   if(type ==='add'){
     return add ; //here we are returning a function - the above add function
   }
   if (type==='subtract')
   {
    return subtract; // we are returning a function - the above subtract function
   }

   return null;
}

var fn = calculator('add'); // this call will return the function add which can be called as in below    

var result = fn(4,5);

console.log(result) ; ///should print 9

第一个电话

var add5 = makeAdder(5);

返回与

完全相同的函数
 function inner(y) { return x+5);

然后您可以调用add5(2),它实际上执行了上述功能。