参数参数如何为这些嵌套函数工作?
Posted
技术标签:
【中文标题】参数参数如何为这些嵌套函数工作?【英文标题】:How do the argument parameters work for these nested functions? 【发布时间】:2020-09-09 22:35:57 【问题描述】:我正在努力提高对 javascript 中高阶函数和回调的理解。我的代码在这里给出了我正在寻找的输出,但我不确定它是如何工作的。我的困惑是参数如何在 filterArray 中为 callback 工作,以及如何将其传递给实际上采用两个参数的 eitherCallback:callback1 和 callback2,它们是函数。从技术上讲,callback(在 filterArray 中)正在接受一个数字,那么如果 eitherCallback,它如何传递给 eitherCallback的两个参数存储为函数?我是 Javascript 的超级新手,因此感谢您的时间和善意。 :)
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]
【问题讨论】:
为什么callback(array[i], i, array)
接受三个参数?
我认为这个挑战只是想说明过滤器是如何工作的,所以它在这里放入了 3 个过滤器参数,即使它不是必需的。挑战赛中已经这样写了,挑战赛的目标是写eitherCallback
函数。
【参考方案1】:
我想强调和扩展@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!
【讨论】:
【参考方案2】:这里的相关点只是eitherCallback
接受两个回调(即两个函数)并返回另一个函数。 JavaScript 中的函数是“第一类”值——这不仅意味着它们可以作为参数传递给其他函数,还可以从函数返回。您可以非常清楚地看到 eitherCallback
从其单行返回一个函数,其中包含 return
语句 - 它返回的是
num => callback1(num) || callback2(num)
这是一个函数表达式。具体来说,它是一个调用callback1
和* callback2
并返回其结果的“逻辑或”的函数。
所以callback
给filterArray
确实采用单个数字参数。这里的函数是 eitherCallback(integerSquareRoot, over100)
- 一个函数,它接受一个数字并告诉您它是整数平方根还是大于 100。
总结:eitherCallback
接受它传递的两个回调并返回另一个回调 - 这个结果回调是传递给 filterArray
的回调。请让我知道是否可以更清楚地说明。
*严格来说并不总是,因为||
短路。但这无关紧要,除非函数有副作用,这里使用的函数没有副作用
【讨论】:
【参考方案3】:让我们看看这个函数:
function eitherCallback(callback1, callback2)
return num => callback1(num) || callback2(num);
这将返回一个新函数,该函数具有 num
的单个参数。
如果我们进一步分解:
这里给上面函数的返回值赋值为intSqRtOrOver100,确实也是一个函数。
const intSqRtOrOver100 = eitherCallback(integerSquareRoot, over100);
函数 eitherCallback 可以访问外部作用域参数(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
) );
【讨论】:
你让我想起了我需要如何审查闭包并检查过滤器,以便我可以在 Javascript 中学习更多方法!谢谢你的时间:)以上是关于参数参数如何为这些嵌套函数工作?的主要内容,如果未能解决你的问题,请参考以下文章
python函数--万能参数,形参,名称空间,嵌套,内置函数globals locals ,关键字nonlocal global