Javascript 这些嵌套函数的参数是如何工作的?
我正在努力提高对Javascript中高阶函数和回调的理解。这里的代码给出了我想要的输出,但我不确定它是如何工作的。我的困惑是filterary中callback的参数是如何工作的,以及如何传递到调用中,它实际上包含两个参数:callback1和callback2,这两个参数都是函数。从技术上讲,callback(在filterary中)是一个数字,那么如果它们的两个参数都存储为函数,那么如何将其传递给它们的回调?我对Javascript非常陌生,非常感谢您的时间和好意。:)Javascript 这些嵌套函数的参数是如何工作的?,javascript,parameters,callback,nested,execution,Javascript,Parameters,Callback,Nested,Execution,我正在努力提高对Javascript中高阶函数和回调的理解。这里的代码给出了我想要的输出,但我不确定它是如何工作的。我的困惑是filterary中callback的参数是如何工作的,以及如何传递到调用中,它实际上包含两个参数:callback1和callback2,这两个参数都是函数。从技术上讲,callback(在filterary中)是一个数字,那么如果它们的两个参数都存储为函数,那么如何将其传递给它们的回调?我对Javascript非常陌生,非常感谢您的时间和好意。:) 函数eitherC
函数eitherCallback(callback1、callback2){
return num=>callback1(num)| | callback2(num);
}
函数filterArray(数组、回调){
常量newArray=[];
for(设i=0;iMath.sqrt(n)%1==0;
常数大于100=n=>n>100;
const intSqRtOrOver100=eitherCallback(integerSquareRoot,大于100);
console.log(过滤器阵列(arrOfNums,intSqRtOrOver100));//应记录:[105,9]
让我们看看这个函数:
function eitherCallback(callback1, callback2) {
return num => callback1(num) || callback2(num);
}
这将返回一个新函数,该函数的num
只有一个参数
因此,如果我们进一步细分:
在这里,您将INTSQRTOVER100赋值给上述函数的返回值,该函数实际上也是一个函数
const intSqRtOrOver100 = eitherCallback(integerSquareRoot, over100);
调用返回函数时,函数eitherCallback可以访问外部作用域参数(callback1,callback2)
,同时也可以访问内部作用域num
参数。
这种技术被称为闭包
此外,数组对象中的javascript内置函数用于过滤、减少等。
例如
您可以直接将已声明的函数传递给它,例如
const filteredArray = arrOfNums.filter( intSqRtOrOver100 );
或者,您可以在线执行此操作:
e、 g
或
这里相关的一点是,
eitherCallback
接受两个回调(即两个函数)并返回另一个函数。JavaScript中的函数是“第一类”值——这不仅意味着它们可以作为参数传递给其他函数,还可以从函数返回。您可以非常清楚地看到,eitherCallback
使用return
语句从其单行返回函数-它返回的是什么
num => callback1(num) || callback2(num)
这是一个函数表达式。具体来说,它是一个调用callback1
和*callback2
并返回其结果的“逻辑或”的函数
因此,提供给filterary
的回调
实际上只接受一个数值参数。这里的函数是回调函数(integerSquareRoot,超过100)——一个函数,它接受一个数字,并告诉您它是整数平方根还是超过100
总而言之:eitherCallback
接受它传递的两个回调并返回另一个回调-这个结果回调就是传递给filterArray
的回调。如果我能说得更清楚,请告诉我
*严格地说,由于
| |
的短路,它并不总是这样。但这并不重要,除非函数有副作用,这里使用的函数没有副作用我想强调并扩展@RobinZigmond所写的内容:
他们需要了解的关键点是:
(1) 当您将函数作为参数传递时,不需要同时传递函数所依赖的参数-这些参数可以稍后提供
也许在您的web中仔细阅读以下示例。下面是您在上面所做工作的简化示例:
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!
为什么
callback(array[i],i,array)
需要三个参数?我认为这个挑战只是试图说明过滤器是如何工作的,所以它在这里放了三个过滤器参数,尽管这不是必需的。在挑战中已经这样写过了,挑战的目标是编写eitherCallback
函数。你提醒我,我需要检查闭包和过滤器,这样我才能学习更多的Javascript方法!谢谢您的时间:)
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!