问题描述
我正在努力提高我对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
) );