JavaScript闭包:通过调用内部函数来添加数组的数字

时间:2019-03-09 16:27:31

标签: javascript closures

我有一个随机数的数组。我想通过使用外部函数调用内部函数来添加这些数字的总和。基本上,使用闭包。

let arr = [93, 95, 88, 0, 55, 91];

let addMany = function(arr){
    let addTwo = function (numbers) {
        console.log('array', arr)
        console.log('numbers', numbers)

        return numbers.reduce((acc,cur) => acc+cur,0)
    }
    return addTwo(arr);
}
let sum = new addMany(arr);
console.log('final sum', sum)

let res = sum.addTwo();

console.log(res);

我还认为我传递数组'arr'的次数太多了。我可能是错的。

我已经使用IIFE和模块化方法进行了尝试。那一个很好。我正在尝试以这种方式实现同​​样的目标。

2 个答案:

答案 0 :(得分:2)

使用return addTwo(arr),您已经直接返回结果。我假设您宁愿自己返回addTwo,并在arr内使用addTwo

let addMany = function(arr){
  let addTwo = function () {
    console.log('array', arr)
    return arr.reduce((acc,cur) => acc+cur,0)
  };
  return addTwo;
}

您将其称为:

 const closured = addMany(1, 2, 3);
 console.log(closured()); // call addTwo

在您的示例中,您将其称为(new addMany(...)).addTwo() ...以实现该行为,请删除return,因为构造函数不返回任何内容,并为{分配了addTwo作为方法{1}}(它是返回的对象):

this

答案 1 :(得分:1)

您可以采用难以理解的函数和原型来添加值。

function Numbers(array) {
    this.numbers = array;
}

Numbers.prototype.add = function () {
    return this.numbers.reduce((a, b) => a + b, 0);
};

var array = [93, 95, 88, 0, 55, 91],
    numbers = new Numbers(array),
    result = numbers.add();

console.log(result);

另一种可能性是使用流畅的接口,在该接口中您可以返回带有某些函数的对象,并可以在其中链接这些函数。

function take(array) {
    var object = {
            add: () => array.reduce((a, b) => a + b, 0),
            update: cb => take(array.map(cb)),
            valueOf: () => array
        };
    return object;
}

var array = [93, 95, 88, 0, 55, 91],
    numbers = take(array),
    result = numbers.add();

console.log(result);
console.log(numbers.valueOf());
console.log(numbers.update(x => 2 * x).valueOf());