闭包实现lazyAdder函数求助:三级调用无法返回正确求和数值
如何用闭包实现lazyAdder函数(三次调用求和)
正确实现代码
这里提供两种直观的实现方式:
箭头函数简洁版
const lazyAdder = firstNum => secondNum => thirdNum => firstNum + secondNum + thirdNum;
普通函数版(清晰展示闭包逻辑)
function lazyAdder(firstNum) { // 闭包保存第一个传入的数值 return function(secondNum) { // 闭包保存前两个传入的数值 return function(thirdNum) { // 最终返回三个数的求和结果 return firstNum + secondNum + thirdNum; } } }
验证测试
用你提供的示例验证功能:
// 示例1 let firstAdd = lazyAdder(1); let secondAdd = firstAdd(2); let sum = secondAdd(3); console.log(sum); // 输出6 // 示例2 let func1 = lazyAdder(10); let func2 = func1(20); let total = func2(3); console.log(total); // 输出33
你的代码问题分析
你写的代码:
const lazyAdder = f => g => h => x => f(g(h))(h(x));
存在两个致命问题:
- 层级冗余:需求是三次调用后返回结果,但你写了4层箭头函数,导致第三次调用后返回的还是一个等待
x参数的函数,永远拿不到求和结果。 - 逻辑错误:
f、g、h都是你传入的数字,并非函数,f(g(h))这种把数字当函数调用的写法完全不成立,运行时会直接抛出错误,更不可能得到求和结果。
闭包实现的核心逻辑
闭包的核心是让内层函数能访问外层函数的变量,这里的实现逻辑很直接:
- 第一次调用
lazyAdder(firstNum),保存firstNum并返回一个接收secondNum的函数; - 第二次调用返回的函数,保存
secondNum并返回一个接收thirdNum的函数; - 第三次调用最后这个函数,直接计算并返回三个数的总和。
内容的提问来源于stack exchange,提问作者trying2code
相关产品推荐
相关产品推荐

