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

如何让函数内的局部数组在每次调用时实现累加?

问题

现有一段JavaScript代码,期望将传入的参数添加至数组并返回所有数组元素,代码如下:

function addToArray(param) {
    const array = [];
    
    array.push(param);
    
    return array; 
}

console.log(addToArray('abc'))
console.log(addToArray(2))
console.log(addToArray('text'))

当前每次调用输出分别为:

[ 'abc' ]

[ 2 ]

[ 'text' ]

但期望的输出为:

[ 'abc' ]

[ 'abc', 2 ]

[ 'abc', 2, 'text' ]

已知将数组放在函数外部可实现该效果,但能否在函数内部以局部变量的方式实现,而不将其设为全局变量?

解决方案

当然可以,核心是通过闭包让函数持久化局部状态,同时避免污染全局作用域。以下是几种可行的实现方式:

方法1:立即执行函数创建闭包

这是最经典的实现方式,把数组封装在闭包作用域里,只有内部函数能访问它:

const addToArray = (function() {
    const array = []; // 仅闭包内可见的局部数组
    return function(param) {
        array.push(param);
        return [...array]; // 返回数组副本,防止外部直接修改内部状态
    }
})();

console.log(addToArray('abc')) // [ 'abc' ]
console.log(addToArray(2))      // [ 'abc', 2 ]
console.log(addToArray('text')) // [ 'abc', 2, 'text' ]

如果不需要限制外部修改,也可以直接返回array本身,但返回副本更安全。

方法2:利用Symbol创建函数私有属性

用ES6的Symbol作为键名,让数组成为函数的“私有”属性,不会被常规遍历方法访问到:

const arrayKey = Symbol('array');

function addToArray(param) {
    if (!this[arrayKey]) {
        this[arrayKey] = [];
    }
    this[arrayKey].push(param);
    return [...this[arrayKey]];
}

// 绑定this指向函数自身,确保状态持久化
const boundAdd = addToArray.bind(addToArray);
console.log(boundAdd('abc')) // [ 'abc' ]
console.log(boundAdd(2))      // [ 'abc', 2 ]
console.log(boundAdd('text')) // [ 'abc', 2, 'text' ]

方法3:ES6类封装私有状态

如果场景适合用类,可通过私有字段实现完全隔离的局部状态:

class ArrayAdder {
    #array = []; // 类私有字段,仅类内部可访问
    add(param) {
        this.#array.push(param);
        return [...this.#array];
    }
}

const adder = new ArrayAdder();
console.log(adder.add('abc')) // [ 'abc' ]
console.log(adder.add(2))      // [ 'abc', 2 ]
console.log(adder.add('text')) // [ 'abc', 2, 'text' ]

内容的提问来源于stack exchange,提问作者ahmed-el-awad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:15:01