我正在读能言善辩JavaScript和我有困难的时候理解下面的例子。 会有人能够做到按线类型说明的行? 具体地讲,我很困惑,为什么第一回路开始于一个,并且为什么推送方法被在两个knownArgs和参数使用。 我知道,这是关系到“部分应用程序”,但想究竟是以线发生线的更详细的解释。
var op = {
"+": function(a,b){return a + b;}
};
function partial(func) {
var knownArgs = arguments;
return function() {
var realArgs = [];
for (var i=1; i<knownArgs.length; i++)
realArgs.push(knownArgs[i]);
for (var i=0; i<arguments.length; i++)
realArgs.push(arguments[i]);
return func.apply(null, realArgs);
};
}
map(partial(op["+"], 1), [0, 2, 4, 6, 8, 10]);
所述knownArgs
变量保持的值的副本arguments
,因为它是当partial()
被调用。 该调用返回另一个功能,内部代码arguments
是一个完全不同的名单-他们传递给的参数返回的功能。 换一种说法:
VAR P =局部(someFunction, “你好”, “世界”);
当p()
被调用时, knownArgs
将是“你好”和“世界”(井和someFunction
太多,但请注意,第一循环开始于1)。 如果调用p()
看起来是这样的:
P( “如何”, “是”, “你”);
那么它会先推“你好”和“世界”到realArgs
列表(从knownArgs
),然后传递到三个参数p()
从arguments
。
编辑 -一步一步击穿如何map(partial(op["+"], 1), [0, 2, 4, 6, 8, 10]);
评估:
首先, op["+"]
已进行评估。 我猜它返回一个函数,大概是这样的:
function add(a, b) { return a + b; }
该“add”功能和值1
被传递到partial()
因此内部partial()
的arguments
的伪阵列看起来像
[ add, 1 ]
也就是说,第一个参数是从“add”功能op["+"]
和第二个是值1
。 那唯一partial()
确实返回匿名函数之前确实是保存arguments
到knownArgs
。 这有许多工作要做,因为怪异的arguments
伪变量总是被分配在每个新值,每个函数调用。 它被保存在这里,以便在匿名函数的代码稍后就可以访问它。
现在,在返回的匿名函数partial()
和偶数的数组,我们称之为map()
这大概功能看起来是这样的(我没有书):
function map(fn, list) { var i, result = []; for (i = 0; i < list.length; ++i) { result.push( fn( list[i] ) ); } return result; }
内map()
那么,第一个参数是从早期的调用返回的匿名函数partial()
这是什么功能呢? 那么,它结合了原有的参数partial()
调用- 除了第一个 -与参数传递给它。 的map()
函数仅通过一个参数,因此每次调用匿名函数所得到的参数列表的值将是1
传递到partial()
然后,在每次迭代中,不同甚至从列表号。
一个简单的例子是考虑当你调用会发生什么:
partial(op["+"], 1)(2);
也就是说,如果你调用partial()
然后立即使用它的返回值(匿名函数)。 效果会与调用:
add(1, 2);
第一回路开始于一个,而不是零,因为knownArgs[0]
包含函数,而不是它的参数。
push
附加到阵列的单个元件。 这是建立一个数组一个相当普遍的方式。
var realArgs = [];
for (var i=1; i<knownArgs.length; i++)
realArgs.push(knownArgs[i]);
for (var i=0; i<arguments.length; i++)
realArgs.push(arguments[i]);
将创建一个从串接一个新的数组knownArgs
和arguments
。 knownArgs
保持咖喱参数和函数(其不追加到realArgs
),和arguments
是供给到当它被调用的函数的参数。