JS:高阶函数问题;接受数组和回调函数->不明白

时间:2019-03-30 20:49:41

标签: javascript arrays function callback

我在下面遇到以下问题:

我的每一个人

编写一个函数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 个答案:

答案 0 :(得分:1)

“尽可能紧密地”是相当苛刻的要求。 Javascript内置函数非常复杂!这些是标准要求您执行的步骤:

http://www.ecma-international.org/ecma-262/7.0/#sec-array.prototype.foreach

用通俗易懂的话来说,由于JS是一种高度动态的语言,因此当您设计内置函数时,您不能仅仅依赖于参数的期望值。对于forEach

  • 参数不能是数组,甚至不能是对象
  • 它可能没有length或它的length可能不是数字
  • 回调可能丢失或不是函数

,依此类推。这就是为什么“尽可能接近”的实现在实际开始循环和调用之前应该进行大量安全检查的原因。

您可以在MDN页面上找到一个真实的forEach填充示例(仅当您决定放弃时才查看):

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

答案 1 :(得分:0)

阅读here。 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);

因此,原始代码中发生的事情是,您传递的ianArray根本不影响addToSum函数,该函数唯一需要的参数是{ {1}},因此一切正常。

答案 2 :(得分:0)

这是一个回调函数:

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);