参数参数如何为这些嵌套函数工作?

Posted

技术标签:

【中文标题】参数参数如何为这些嵌套函数工作?【英文标题】:How do the argument parameters work for these nested functions? 【发布时间】:2020-09-09 22:35:57 【问题描述】:

我正在努力提高对 javascript 中高阶函数和回调的理解。我的代码在这里给出了我正在寻找的输出,但我不确定它是如何工作的。我的困惑是参数如何在 filterArray 中为 callback 工作,以及如何将其传递给实际上采用两个参数的 eitherCallbackcallback1 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 并返回其结果的“逻辑或”的函数。

所以callbackfilterArray 确实采用单个数字参数。这里的函数是 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 中学习更多方法!谢谢你的时间:)

以上是关于参数参数如何为这些嵌套函数工作?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何为嵌套函数编写单元测试用例(Jasmine)?

对python中的参数进行操作的嵌套函数装饰器

EXCEL函数内部的嵌套函数

python函数--万能参数,形参,名称空间,嵌套,内置函数globals locals ,关键字nonlocal global

使用具有多个参数和索引的lapply / sapply减少函数内的嵌套循环

可变长参数函数对象嵌套名称空间和作用域