部分应用程序 - 雄辩的Javascript(Partial Application - Eloqu

2019-08-02 14:46发布

我正在读能言善辩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]);

Answer 1:

所述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]); 评估:

  1. 首先, op["+"]已进行评估。 我猜它返回一个函数,大概是这样的:

     function add(a, b) { return a + b; } 
  2. 该“add”功能和值1被传递到partial() 因此内部partial()arguments的伪阵列看起来像

     [ add, 1 ] 

    也就是说,第一个参数是从“add”功能op["+"]和第二个是值1 。 那唯一partial()确实返回匿名函数之前确实是保存argumentsknownArgs 。 这有许多工作要做,因为怪异的arguments伪变量总是被分配在每个新值,每个函数调用。 它被保存在这里,以便在匿名函数的代码稍后就可以访问它。

  3. 现在,在返回的匿名函数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);


Answer 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]);

将创建一个从串接一个新的数组knownArgsargumentsknownArgs保持咖喱参数和函数(其不追加到realArgs ),和arguments是供给到当它被调用的函数的参数。



文章来源: Partial Application - Eloquent Javascript