JavaScript中使用自执行内部函数的数组复制函数

Array Replication Function in JavaScript using self-executing inner function

本文关键字:数组 复制 函数 内部函数 执行 JavaScript      更新时间:2023-09-26

我正在尝试用JavaScript编写一个数组复制函数,该函数将以数组和复制因子作为输入参数,并返回复制的数组。

就像这样:

expect(replicate([2,3,4],2).toEqual([2,3,4,2,3,4]));

我试图通过一个递归调用的、自执行的内部函数来完成这个任务,该内部函数应该在完成时将所需的值返回给外部函数。

内部函数似乎工作正常:

var replicate = function (inputArray, n) {
    var outputArray = [];
    return (function replicateInner(n) {
        if (n > 0) {
            outputArray.push(inputArray.slice(0));
            replicateInner(--n)
        } else {
            alert('inner function returns: ' + outputArray);
            //inner function returns: [2,3,4,2,3,4]
            return outputArray;
        }
    })(n);
 };

但是当我调用外部函数时,它返回undefined

alert(replicate([2,3,4],2)); // returns undefined, not [2,3,4,2,3,4]

你知道我遗漏了什么吗?谢谢!

因为您没有返回replicateInner(--n)的结果,像这样

return replicateInner(--n);

同样,当你把inputArray.slice(0)推到outputArray时,结果将是这样的

[ [ 2, 3, 4 ], [ 2, 3, 4 ] ]

你需要做的是像这样连接数组

outputArray = outputArray.concat(inputArray.slice(0));
修改后,输出变成
[ 2, 3, 4, 2, 3, 4 ]

好问题。下面是一个简化的答案,它同时具有IIFE和递归。我们不需要传递任何东西,也不需要传递任何东西给IIFE,因为它都在闭包范围内。

var replicate = function (inputArray, n) {
    var outputArray = [];
    (function replicateInner() {
        if (n > 0) {
            outputArray = outputArray.concat(inputArray.slice(0));
            --n;
            replicateInner()
        }
    })();
    return outputArray;
};