参数参数如何用于这些嵌套函数?

问题描述

我正在努力提高我对Javascript中高阶函数和回调的理解。我的代码在这里为我提供了所需的输出,但我不确定它的工作方式。我的困惑是参数在 filterarray 中用于 callback 的方式以及如何传递给实际上包含两个参数的任一Callback callback1 callback2 。从技术上讲,回调(位于 filterarray 中)是一个数字,因此如果 anyCallback ,如何将其传递给双向回调的两个参数存储为函数?我是Java的超级新手,因此感谢您的时间和友善。 :)

function eitherCallback(callback1,callback2) {
  return num => callback1(num) || callback2(num); 
}

function filterarray(array,callback) {
  const newArray = [];
  for (let i = 0; i < array.length; i += 1) {
    if (callback(array[i],i,array)) newArray.push(array[i]);
  }
  return newArray;
}
const arrOfNums = [10,35,105,9];
const integerSquareRoot = n => Math.sqrt(n) % 1 === 0;
const over100 = n => n > 100;
const intSqRtOrOver100 = eitherCallback(integerSquareRoot,over100);
console.log(filterarray(arrOfNums,intSqRtOrOver100)); // should log: [105,9]
@H_502_22@

解决方法

这里的相关点只是eitherCallback接受两个回调(即两个函数),而返回另一个函数。 JavaScript中的函数是“第一类”值-不仅意味着它们可以作为参数传递给其他函数,还可以从函数中返回。您可以非常清楚地看到,eitherCallback使用return语句从单行返回一个函数-它返回的是

num => callback1(num) || callback2(num)

这是一个函数表达式。具体来说,该函数调用callback1和* callback2,并返回结果的“逻辑或”。

因此,赋予callback的{​​{1}}确实采用了一个数字参数。这里的函数是filterArray-一个接受数字并告诉您它是整数平方根还是大于100的函数。

总结一下:eitherCallback(integerSquareRoot,over100)接受传递的两个回调,然后返回另一个回调-此结果回调是传递给eitherCallback的回调。请让我知道是否可以澄清任何事情。

*严格来说,由于filterArray的短路,并非总是如此。但这无关紧要,除非函数具有副作用,否则此处使用的副作用就不会

,

我想强调和扩展@RobinZigmond的内容:

他们要理解的关键是:

(1)当您将函数作为参数传递时,不需要同时传递函数所依赖的参数-这些参数可以稍后提供。

也许可以在您的网络中密切关注以下示例。这是您上面所做的简化示例:

function a(someNumber){ return someNumber;}

function b(functionArgument){ return functionArgument;}

现在,当我这样做时:

b(a)   // => function a(someNumber) // of course if I pass in `a` as an argument to the `b` function,then i will get `a` back!!

我可以将其分配给常量:

   const c = b(a);   // when i pass a function,I do not need to pass in the argument that a requires - which is also a number.

   c // => function a(someNumber)  // to be expected

   c(3) // => returns 3!
,

让我们看一下这个功能:

function eitherCallback(callback1,callback2) {
  return num => callback1(num) || callback2(num); 
}

这将返回一个新函数,该函数具有用于num的单个参数。

所以,如果我们进一步细分它:

在这里,您将intSqRtOrOver100分配给上述函数的返回值,该函数的确是一个函数。

const intSqRtOrOver100 = eitherCallback(integerSquareRoot,over100);

函数anyCallback可以访问外部作用域参数(callback1,callback2),同时在调用返回的函数时也可以访问内部作用域num参数。 这项技术称为关闭

此外,在Array对象中的javascript中内置了用于过滤,缩小等功能。 例如 您可以直接将其传递给已声明的函数,例如

const filteredArray = arrOfNums.filter( intSqRtOrOver100 );

或者您可以内联:

例如

const filteredArray = arrOfNums.filter( num => ( integerSquareRoot(num) || over100(num) ) )

const filteredArray = arrOfNums.filter( num => (
  Math.sqrt(num) % 1 === 0 ||
  num > 100
) );