javascript - 我正在阅读 Eloquent Javascript,我对这个部分函数示例有点困惑。请帮忙解释一下

标签 javascript function partial

function asArray(quasiArray, start) {
  var result = [];
  for (var i = (start || 0); i < quasiArray.length; i++)
    result.push(quasiArray[i]);
  return result;
}

function partial(func) {
  var fixedArgs = asArray(arguments, 1);
  return function(){
    return func.apply(null, fixedArgs.concat(asArray(arguments)));
  };
}

function compose(func1, func2) {
  return function() {
    return func1(func2.apply(null, arguments));
  };
}

var isUndefined = partial(op["==="], undefined);
var isDefined = compose(op["!"], isUndefined);
show(isDefined(Math.PI));
show(isDefined(Math.PIE));

为什么 compose 函数不能简单地返回:

func1(func2);

并给出正确的输出。我认为存储在变量 isUndefined 中的部分函数已经返回 func.apply(null, [fixed, arguments])

var op = {
"+": function(a, b){return a + b;},
"==": function(a, b){return a == b;},
"===": function(a, b){return a === b;},
"!": function(a){return !a;}
/* and so on */
};

最佳答案

partialcompose 都是 higher-order functions .

isUn​​defined 将返回一个函数,该函数在被调用时将使用原始参数以及调用时传递的任何新参数来调用最初传递的函数。

要回答您的问题,您需要对从 partial 返回的函数调用 apply,而这又会调用 apply函数最初传递给 partial

您希望 compose 返回一个函数,该函数在被调用时将返回调用第一个函数的结果并将第二个函数作为参数传递(第二个函数将参数传递给 compose 调用)。如果 compose 返回了 func1(func2),那么您会将调用的结果分配给变量 isDefined

编辑:

现在我们有了op,让我们试着分解一下:

var isUndefined = partial(op["==="], undefined);

这相当于

var isUndefined = partial(function(a, b){return a === b;}, undefined);

isUn​​defined 被分配了一个函数,该函数在调用时将调用作为第一个参数传递给 partial 的函数,将 undefined 传递为该函数调用的第一个参数,后跟传递给函数的参数 isUn​​defined

partial(function(a, b){return a === b;}, undefined /* this will become 'a' when isUndefined is invoked */)(argumentForisUndefined /* this will become 'b' when isUndefined is invoked */);

isDefinedisUn​​defined 与另一个否定 isUn​​defined 结果的函数组合在一起。

var isDefined = compose(op["!"], isUndefined);

相当于

var isDefined = compose(function(a){return !a;}, isUndefined);

这等同于(为清楚起见重命名变量)

var isDefined = compose(

    function(a){return !a;}, 

    partial(  /* partial function becomes 'a' passed to first function */
        function(b, c) {
            return b === c;
        }, 
        undefined /* undefined becomes 'b' passed to partial */
    ) 

)(argumentForisDefined /* argumentForisDefined becomes 'c' passed to partial */);

如果我们看看目前为止的内容并用可读性代替,归结为一个函数,该函数接受一个参数并将其与未定义的进行比较,取反结果并返回一个 bool 值

var isDefined = function (b) { return !undefined === b; } 

关于javascript - 我正在阅读 Eloquent Javascript,我对这个部分函数示例有点困惑。请帮忙解释一下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8100354/

相关文章:

c - 如何正确定义我的函数原型(prototype)?

javascript - 如何在 Javascript 的基于 promise 的设置中调用 "apply"以将参数传递给下一个 then()?

javascript - 背景颜色到CSS中的透明背景图像

javascript - Grails 使用资源控制 javascript 位置

javascript - 如何在 VS Code 中的函数名称和左括号之间添加空格

c++ - 三角形类 C++

javascript - OrientDB Javascript 服务器端函数

jquery - 如何将参数传递给MVC4 razor中的部分 View

typescript - 有没有Partial的替代方法,它仅接受其他类型的字段,而别无其他?

javascript - 向 Rails Controller 指示哪个 View 调用了操作