我正在关注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);
答案 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),它实际上执行了上述功能。