Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.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_Function_For Loop_Call - Fatal编程技术网

Javascript 分解函数表达式-与几行/参数斗争

Javascript 分解函数表达式-与几行/参数斗争,javascript,function,for-loop,call,Javascript,Function,For Loop,Call,因此,尽管阅读了一两篇解释,我还是在看一段让我困惑的代码: 这是密码 var puzzlers = [ function (a) { return 8*a - 10; }, function (a) { return (a-3) * (a-3) * (a-3); }, function (a) { return a * a + 4; }, function (a) { return a % 5; } ]; var start = 2; var applyAndEmpty =

因此,尽管阅读了一两篇解释,我还是在看一段让我困惑的代码:

这是密码

var puzzlers = [
  function (a) { return 8*a - 10; },
  function (a) { return (a-3) * (a-3) * (a-3); },
  function (a) { return a * a + 4; },
  function (a) { return a % 5; }
];

var start = 2;

var applyAndEmpty = function (input, queue) {
  var length = queue.length;
  for (var i = 0; i < length; i++) {
    input = queue.shift()(input);
  }
  return input;
};

alert(applyAndEmpty(start, puzzlers));
var谜题=[
函数(a){返回8*a-10;},
函数(a){返回(a-3)*(a-3)*(a-3);},
函数(a){返回a*a+4;},
函数(a){返回一个%5;}
];
var启动=2;
var applyAndEmpty=函数(输入,队列){
var length=queue.length;
对于(变量i=0;i
我了解其中的大部分内容,但分解会很好,真正让我感到困惑的是这行的开头和结尾
input=queue.shift()(input)我知道它正在使用输入来存储结果,但为什么?为什么结尾也有输入参数

PS此行
警报(applyAndEmpty(开始,谜语))我知道调用该函数,然后向其发出警报。为什么我必须先调用函数,然后才能对其进行警报/控制台日志等操作?这是不是因为它不是生命,所以在函数被调用之前没有什么需要提醒的?它很像一个“开”按钮


对不起,时间太长了,提前谢谢

为了清晰起见,我在
for
循环中稍微编辑了代码

//此数组包含5个项,每个项是一个函数,它接受一个参数并返回一个数字。
变量谜题=[
函数(a){返回8*a-10;},
函数(a){返回(a-3)*(a-3)*(a-3);},
函数(a){返回a*a+4;},
函数(a){返回一个%5;}
];
//起始值为2。
var启动=2;
var applyAndEmpty=函数(输入,队列){
//获取队列中的项目数。
var length=queue.length;
//迭代队列中的所有项目。
对于(变量i=0;i返回8*2-10=6
//i=1,输入=6->返回(6-3)*(6-3)*(6-3)=27
//i=2,输入=27->返回27*27+4=733
//i=3,输入=733->返回733%5=3

//因此,警报显示为三。
这只是一种链接数组中函数的方法,以便将第一个函数的结果传递给第二个函数,将第二个函数的结果传递给第三个函数,依此类推

f=[a=>8*a-10,
a=>(a-3)*(a-3)*(a-3),
a=>a*a+4,
a=>a%5]
console.log(f[3](f[2](f[1](f[0](2 '))//3
console.log(f.pop()(f.pop()(f.pop()(f.pop()(2‘‘‘‘‘))//3

console.log((a=>a%5)((a=>a*a+4)((a=>(a-3)*(a-3)*(a-3)*(a-3)*(a-3))((a=>8*a-10)(2‘‘‘‘‘)//3
队列
是一个数组,
shift
返回该数组中的第一项,该项恰好是一个函数,使用
(参数)
调用函数之前不会执行任何操作。IIFE会立即调用函数,但命名函数通常只定义一次,因此可以使用不同的输入重复调用。嘿,Thijs,谢谢你的回复,非常好!我现在想知道,
for
循环如何知道它在队列上运行而不是在输入@不客气!你能重新措辞你的问题吗?我不确定您想知道什么。
//迭代队列中的所有项目。for(var i=0;i
…..在脚本的这一部分中,for循环如何知道迭代队列参数而不是输入?希望这更有意义>。for循环不会“继续运行”任何内容。在您粘贴的代码上方的行中,将确定
拼图
中的项目数。for循环的迭代次数与
拼图
数组中的项目数相同。这是否回答了您的问题?