JS: проблема функции высшего порядка;Принять массив и функцию обратного вызова -> не понимаю - PullRequest
0 голосов
/ 30 марта 2019

У меня есть следующая проблема ниже:

Мой для каждого

Напишите функцию myForEach, которая принимает массив и функцию обратного вызова. Поведение myForEach должно максимально полно отражать функциональность встроенного метода массива .forEach ().

Ниже приведен код:

let sum = 0;

function addToSum(num) {
    sum += num;
}

let nums = [10, 20, 30];


function myForEach(anArray, callback){


  for (let i=0; i<anArray.length; i++){
    let num = anArray[i]; 
    //console.log(num)

    // I don't understand what this line of code is doing...
    callback(num, i, anArray); 
  }
  return undefined
}



myForEach(nums, addToSum);

console.log(sum); // 6

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

 callback(num, i, anArray); 

почему есть 3 аргумента? и где эти аргументы передаются?

Ответы [ 3 ]

1 голос
/ 31 марта 2019

«как можно ближе» - довольно жесткое требование. Встроенные функции Javascript очень сложны! Вот шаги, которые стандарт требует от вас выполнить:

* ** 1003 тысяча два *http://www.ecma -international.org / ECMA-262 / 7,0 / # втор-array.prototype.foreach

С точки зрения непрофессионала, поскольку JS является высокодинамичным языком, когда вы разрабатываете встроенную функцию, вы не можете просто полагаться на то, что параметры ожидаются от них. В случае forEach:

  • аргумент может быть не массивом, и даже не объектом
  • может не иметь length или length может быть не числом
  • обратный вызов может отсутствовать или не быть функцией

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

Вы можете найти пример реального заполнения forEach на странице MDN (смотрите, только если вы решили отказаться от этого):

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

0 голосов
/ 31 марта 2019

Это функция обратного вызова:

callback(); 

Это функция, которую вы передали в myForEach - в вашем коде это addToSum, но это ссылка с другим именем.Он используется, если у вас есть разные функции для обработки разных вещей.В своем коде вы можете так же легко использовать addToSum и вообще забыть о callback:

let sum = 0;

function addToSum(num) {
  sum += num;
}

let nums = [10, 20, 30];


function myForEach(anArray) {


  for (let i = 0; i < anArray.length; i++) {
    let num = anArray[i];
    //console.log(num)

    // I don't understand what this line of code is doing...
    addToSum(num, i, anArray);
  }
  return undefined
}



myForEach(nums, addToSum);

console.log(sum); 
0 голосов
/ 31 марта 2019

Читайте здесь об этом.Javascript не волнует, сколько параметров вы передаете.Например, следующий код все еще работает, но предупреждает undefined в функции addToSum:

let sum = 0;

function addToSum(num, i, k, j) {
  sum += num;
  console.log("i is:" + i);
  console.log("k is:" + k);
  console.log("j is:" + j);
}

let nums = [10, 20, 30];

function myForEach(anArray, callback) {
  for (let i = 0; i < anArray.length; i++) {
    let num = anArray[i];
    //console.log(num)

    // I don't understand what this line of code is doing...
    callback(num);
  }
  return undefined
}

myForEach(nums, addToSum);
console.log(sum);

То, что происходит в вашем исходном коде, заключается в том, что передаваемые вами i и anArray не влияют на функцию addToSum и являются единственнымПараметр, который нужен этой функции, равен num, поэтому все работает хорошо.

...