【问题标题】:JS: Higher Order Function Problem; Accept Array and Callback Function --> don't understandJS:高阶函数问题;接受数组和回调函数 --> 不明白
【发布时间】:2019-03-30 20:49:40
【问题描述】:

我有以下问题:

我的每个人

编写一个接受数组和回调函数的函数 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 个参数?这些论点在哪里传递?

【问题讨论】:

  • callback 是对addToSum 的引用,它只使用第一个参数num 并忽略接下来的两个传递。
  • 这只是为了完全镜像原生的forEach 方法。回调接受 3 个参数,与此处相同:元素、其索引和数组本身:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 顺便说一句,不确定这是否是“作弊”,但使用function myForEach (anArray, callback, thisArg) { anArray.forEach(callback, thisArg); }会不会容易得多?

标签: javascript arrays function callback


【解决方案1】:

“尽可能接近”是一个相当苛刻的要求。 Javascript内置函数非常复杂!以下是标准要求您实施的步骤:

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

通俗地说,由于 JS 是一种高度动态的语言,所以当你设计一个内置函数时,你不能仅仅依赖于你所期望的参数。如果是forEach

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

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

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

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

【讨论】:

    【解决方案2】:

    阅读here 了解它。 Javascript 不关心你传递了多少参数。例如,以下代码仍然有效,但会在 addToSum 函数中提醒 undefined

    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 函数,并且此函数需要的唯一参数是 num 所以一切正常.

    【讨论】:

      【解决方案3】:

      这是一个回调函数:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多