闭包返回函数的参数如何传递至内部函数?示例代码相关疑问
关于闭包示例代码的疑问解答
先理清acc的本质
你混淆了acc和accumulator的关系:
- 执行
const acc = accumulator();时,accumulator函数已经执行完毕,它返回的是内部定义的箭头函数:(num) => { sum = sum + num; return sum; } - 所以
acc其实是这个箭头函数的引用,调用acc(3)本质是直接调用该箭头函数,参数3自然对应箭头函数的num参数——这和accumulator(3)完全不是一回事,accumulator本身不需要接收参数。
这确实涉及闭包概念
这个例子是闭包的典型应用:
- 当
accumulator执行结束后,它的执行上下文本应被销毁,内部的sum变量也会被垃圾回收机制回收。但因为返回的箭头函数仍然持有对sum的引用,sum变量被保留了下来,形成了闭包。 - 每次调用
acc(num)时,箭头函数都会访问并修改这个被闭包保留的sum变量,这就是两次调用能得到累加结果3和8的核心原因。
代码执行流程拆解
我们一步步梳理:
- 执行
accumulator():初始化sum = 0,返回箭头函数,此时sum被箭头函数引用,不会被销毁。 - 执行
acc(3):调用箭头函数,num接收3,执行sum = 0 + 3,返回3。 - 执行
acc(5):再次调用箭头函数,num接收5,执行sum = 3 + 5,返回8。
function accumulator(){ let sum =0; return (num) =>{ sum = sum + num; return sum; } } const acc = accumulator(); console.log(acc(3)); // 输出3 console.log(acc(5)); // 输出8
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

