所以我正在看一段令我困惑的代码,尽管他读了两两个解释:
这是代码..
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,因此在调用该函数之前没有任何实际警报吗?它就像一个“开启”按钮?
对不起,这很长,提前谢谢!
答案 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
,则表示您将使用值puzzlers
从2
调用每个方法。 applyAndEmpty
的结果不再是3,而只是2,因为输入变量永远不会改变。因此,如果你不存储调用puzzler方法的结果,你也可以完全跳过它们并立即返回输入参数。
答案 1 :(得分:0)
它只是一种链接数组中函数的方法,因此第一个函数的结果传递给第二个函数,第二个函数的结果传递给第三个函数,依此类推......
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;