拆分函数表达式 - 用耦合线/参数进行挣扎

时间:2017-08-25 09:24:52

标签: 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 = function (input, queue) {
  var length = queue.length;
  for (var i = 0; i < length; i++) {
    input = queue.shift()(input);
  }
  return input;
};

alert(applyAndEmpty(start, puzzlers));

我理解其中的大部分内容,但细分会很棒,真正让我感到惊讶的是这一行的开头和结尾input = queue.shift()(input); 我知道它正在使用输入来存储结果,但为什么?为什么最后还有输入参数

PS这一行alert(applyAndEmpty(start, puzzlers));我知道调用该函数然后提醒它。为什么我必须先调用一个函数才能提醒/控制日志等呢?这是因为它不是IIFE,因此在调用该函数之前没有任何实际警报吗?它就像一个“开启”按钮?

对不起,这很长,提前谢谢!

2 个答案:

答案 0 :(得分:1)

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

// This array contains 5 items, each item is a function which takes a single param and returns a number.
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; }
];

// The start value is 2.
var start = 2;

var applyAndEmpty = function (input, queue) {
  // Get the number of items in the queue.
  var length = queue.length;
  // Iterate over all the items in the queue.
  for (var i = 0; i < length; i++) {
    // Remove the item at index 0 from the queue, the item is stored in the var.
    var itemMethod = queue.shift();
    // Execute the method, pass it the current value as input param. The result 
    // of the method will be placed back into the input variable.
    input = itemMethod(input);
  }
  // Return the modified input value.
  return input;
};

// Runs the applyAndEmpty method and shows the output in an alert.
alert(applyAndEmpty(start, puzzlers));

// The breakdown of the for loop:
// i = 0, input = 2 -> return 8 * 2 - 10 = 6
// i = 1, input = 6 -> return (6-3) * (6-3) * (6-3) = 27
// i = 2, input = 27 -> return 27 * 27 + 4 = 733
// i = 3, input = 733 -> return 733 % 5 = 3
// And thus the alert says three.

如果您未将当前itemMethod的结果放回input,则表示您将使用值puzzlers2调用每个方法。 applyAndEmpty的结果不再是3,而只是2,因为输入变量永远不会改变。因此,如果你不存储调用puzzler方法的结果,你也可以完全跳过它们并立即返回输入参数。

答案 1 :(得分:0)

它只是一种链接数组中函数的方法,因此第一个函数的结果传递给第二个函数,第二个函数的结果传递给第三个函数,依此类推......

&#13;
&#13;
 ScriptEngine engine = Python.CreateEngine();
 ScriptScope scope = engine.ExecuteFile("FindProducts.py");
 dynamic products = scope.GetVariable("products");
 foreach (dynamic product in products)
 {
    Console.WriteLine("{0}: {1}", product.ProductName, product.Price);
 }
&#13;
&#13;
&#13;