Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这些嵌套函数的参数是如何工作的?_Javascript_Parameters_Callback_Nested_Execution - Fatal编程技术网

Javascript 这些嵌套函数的参数是如何工作的?

Javascript 这些嵌套函数的参数是如何工作的?,javascript,parameters,callback,nested,execution,Javascript,Parameters,Callback,Nested,Execution,我正在努力提高对Javascript中高阶函数和回调的理解。这里的代码给出了我想要的输出,但我不确定它是如何工作的。我的困惑是filterary中callback的参数是如何工作的,以及如何传递到调用中,它实际上包含两个参数:callback1和callback2,这两个参数都是函数。从技术上讲,callback(在filterary中)是一个数字,那么如果它们的两个参数都存储为函数,那么如何将其传递给它们的回调?我对Javascript非常陌生,非常感谢您的时间和好意。:) 函数eitherC

我正在努力提高对Javascript中高阶函数和回调的理解。这里的代码给出了我想要的输出,但我不确定它是如何工作的。我的困惑是filterarycallback的参数是如何工作的,以及如何传递到调用中,它实际上包含两个参数:callback1callback2,这两个参数都是函数。从技术上讲,callback(在filterary中)是一个数字,那么如果它们的两个参数都存储为函数,那么如何将其传递给它们的回调?我对Javascript非常陌生,非常感谢您的时间和好意。:)

函数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!