You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

可多次调用的JS累加函数重复调用值异常问题修复咨询

修复JavaScript累加函数的状态共享问题

你的问题核心是所有函数调用共享了同一个闭包变量sum,每次调用sumFour都会修改这个sum的值,导致后续调用的初始值不再是你期望的4。要解决这个问题,需要让每个函数实例持有独立的总和状态,每次调用都返回一个新的闭包实例,而非修改原有的状态。

修改后的代码

'use strict';

function myAdd(...args) {
  // 内部函数:创建持有当前总和的累加函数实例
  function createAddFn(currentSum) {
    const addFn = (...newArgs) => {
      // 计算新的总和:当前值 + 新传入的所有参数之和
      const updatedSum = currentSum + newArgs.reduce((acc, val) => acc + val, 0);
      // 返回新的累加函数实例,携带更新后的总和
      return createAddFn(updatedSum);
    };
    
    // 重写valueOf,转成数值时返回当前总和
    addFn.valueOf = () => currentSum;
    return addFn;
  }

  // 计算初始参数的总和,生成第一个累加函数实例
  const initialSum = args.reduce((acc, val) => acc + val, 0);
  return createAddFn(initialSum);
}

// 测试验证
let sumFour = myAdd(2)(2);
console.log(+sumFour(2)); // 输出6
console.log(+sumFour(2)); // 输出6

代码逻辑说明

  1. 独立状态的闭包:createAddFn会为每个累加函数实例创建独立的currentSum变量,不同实例之间的状态互不干扰。
  2. 每次调用生成新实例:当你调用sumFour(2)时,会基于sumFour持有的4计算出6,然后返回一个持有6的新函数实例,而原sumFour的currentSum依然是4,所以第二次调用sumFour(2)还是会得到6。
  3. valueOf的作用:保证当用+运算符转换函数实例时,能返回当前的总和数值。

内容的提问来源于stack exchange,提问作者Ahmad Wehbe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:10:09