Javascript 基本闭包示例混淆
我正在学习Tyler McGinnis关于执行上下文、调用堆栈和闭包的教程 我对闭包示例有点困惑。我理解闭包是当一个函数在另一个函数中时。我还了解到内部函数可以访问父函数参数(如视频中所述) 我在下面的代码中感到困惑的是,当调用makeAdder(5)时,内部函数是否在第一次调用时也没有被调用?Tyler似乎建议在第一次调用makeAdder时将其从调用堆栈中弹出,只保留内部函数不变 第二部分我不明白当我们调用add5(2)时,这是调用makeAdder(5)否?当父函数只接受一个参数时,如何添加两个参数 如果有人能一步一步地了解它是如何被调用的,那就太好了Javascript 基本闭包示例混淆,javascript,closures,Javascript,Closures,我正在学习Tyler McGinnis关于执行上下文、调用堆栈和闭包的教程 我对闭包示例有点困惑。我理解闭包是当一个函数在另一个函数中时。我还了解到内部函数可以访问父函数参数(如视频中所述) 我在下面的代码中感到困惑的是,当调用makeAdder(5)时,内部函数是否在第一次调用时也没有被调用?Tyler似乎建议在第一次调用makeAdder时将其从调用堆栈中弹出,只保留内部函数不变 第二部分我不明白当我们调用add5(2)时,这是调用makeAdder(5)否?当父函数只接受一个参数时,如何
var计数=0;
函数加法器(x){
返回函数内部(y){
返回x+y;
}
}
var add5=makeAdder(5);
console.log(add5);//对makeAdder的调用返回什么
计数+=add5(2);
控制台日志(计数)代码>一个简单的方法是将其视为一个返回函数的函数——可以像普通函数一样调用函数,因为它是。因此,函数返回类型的第一个调用是一个函数
看下面的例子
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),它基本上执行上述函数 一个简单的方法是将其视为一个返回函数的函数——它可以像普通函数一样调用,因为它是。因此,函数返回类型的第一个调用是一个函数
看下面的例子
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),它基本上执行上述函数
当调用makeAdder(5)
时,内部函数在第一次调用时是否也没有被调用
不,不是。此时仅调用makeAdder
,而makeAdder
本身不进行任何调用。它只返回一个对象,而该对象恰好是一个函数。返回一个函数是在没有实际调用它的情况下完成的
当我们调用add5(2)
时,这是在调用makeAdder(5)
no
它没有调用makeAdder(5)
。前面的add5
是调用makeAdder(5)
的结果,因此add5
就是这个内部函数。这里发生的特殊情况是,当调用add5
时,“执行上下文”被还原,它表示makeAdder
返回函数时内部的状态。这实际上意味着,当add5
(内部函数)引用x
变量时,它将在x
中找到它先前调用makeAdder
时的值
当父函数只接受一个参数时,如何添加两个参数
事实上,当我们调用父函数时,第二个参数还不知道,我们当时也不需要知道,因为内部函数当时还没有执行。调用父函数的重要一点是,我们建立了x
的值,它将“继续”,即使只能通过调用内部函数来访问它
当我们调用内部函数时,我们提供了所需的第二个参数。然后,内部函数可以将它对x
值的“神奇”引用(在我们进行父调用时提供)与它自己接收的正常参数结合起来
当调用makeAdder(5)
时,内部函数在第一次调用时是否也没有被调用
不,不是。此时仅调用makeAdder
,而makeAdder
本身不进行任何调用。它只返回一个对象,而该对象恰好是一个函数。返回一个函数是在没有实际调用它的情况下完成的
当我们调用add5(2)
时,这是在调用makeAdder(5)
no
它没有调用makeAdder(5)
。前面的add5
是调用makeAdder(5)
的结果,因此add5
就是这个内部函数。这里发生的特殊情况是,当调用add5
时,“执行上下文”被还原,它表示makeAdder
返回函数时内部的状态。这实际上意味着,当add5
(内部函数)引用x
变量时,它将在x
中找到它先前调用makeAdder
时的值
当父函数只接受一个参数时,如何添加两个参数
事实上,当我们调用父函数时,第二个参数还不知道,我们当时也不需要知道,因为内部函数当时还没有执行。调用父函数的重要一点是,我们建立了x
的值,它将“继续”,即使只能通过调用内部函数来访问它
当我们调用内部函数时,我们提供了所需的第二个参数。然后,内部函数可以将它对x
值的“神奇”引用(在我们进行父调用时提供)与它自己接收的正常参数结合起来。调用makeAdder
不会调用内部
。它返回inner
,因此add5
基本上等于函数inner(y){return 5+y;}
我知道闭包是