Закрытия JavaScript: добавьте номера массива, вызвав внутреннюю функцию - PullRequest
1 голос
/ 09 марта 2019

У меня есть массив со случайными числами.Я хочу добавить сумму этих чисел с помощью вызова внутренней функции с помощью внешней функции.В основном, используя замыкания.

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 ]

2 голосов
/ 09 марта 2019

С 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 в качестве метода для this (который является возвращаемый объект):

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

    return arr.reduce((acc,cur) => acc+cur,0)
  };
}
1 голос
/ 09 марта 2019

Вы можете взять инстанцируемую функцию и прототип для добавления значений.

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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...