javascript - Js 条件柯里化(Currying)

标签 javascript currying

我试图理解这段代码很长时间,我知道柯里化(Currying)函数,但对这段代码感到困惑,请解释背后的理论

var currying = function(fn) {
  var args = [];
  return function() {
    if (!!arguments.length){
      [].push.apply(args, arguments);
      return arguments.callee;
    } else {
      // what is 'this' in apply method
      return fn.apply(this, args);
    }
  }
} 

// currying var or args
// please explain the code below
var find = function(arr, el){
  return arr.indexOf(el) !== -1;
}

var newFind = currying(find)([1,2,3]);
console.log( newFind(1)());
console.log( newFind(2)());

最佳答案

为了更容易解释,让我们转换一下代码的最后部分:

// newFind = currying(find)([1,2,3]);
// console.log(newFind(1)());
// above is the same with below
console.log( currying(find)([1,2,3])(1)());

currying 采用函数 find,因此 currying 中的 fnfind。 当它返回一个函数时,可以像代码 currying(find)([1,2,3])

上所示那样调用它

让我们看看这部分,currying(find)([1,2,3])。 它执行currying的返回方法。它可以使用关键字 arguments 访问参数,该参数是代码上的 [1,2,3] 数组。

参数是数组,这意味着它具有长度值。然后将参数插入 args 数组并返回其被调用者,这意味着柯里化(Currying)的内部方法。

当它再次返回方法时,可以使用 currying(find)([1,2,3])(1)()< 的下一个参数 (1) 再次调用它。 再次,它使用参数:1 执行currying 的内部方法。那么它不是一个数组,所以它调用fn.apply(this, args)。 在这种情况下,代码中的 this 关键字没有任何意义。您可以将 this 替换为 null 或使用 fn(...args) 代替。该代码用于将参数数组转换为每个参数。例如[[1,2,3], 1] 转换为 [1,2,3], 1 然后,最后它执行带有参数[1,2,3]1find函数。您应该记住所有这些都是来自 currying 返回的方法,因此您必须将其作为函数调用。在末尾附加 () 来执行该函数。

关于javascript - Js 条件柯里化(Currying),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55803565/

相关文章:

javascript - 如何从 github 存储库安装 NodeJS 包

javascript - fileupload Jquery 不能动态工作

javascript - 音频播放器不工作

javascript - setInterval 使用不当

scala - 如何在Scala中从a => b => c获得(a,b)=> c?

function - 这种柯里化(Currying)函数的语法有什么区别吗?

haskell - 为什么在 Haskell 中为 Curry 类考虑局部小笛卡尔封闭类别是公平的?

javascript - 在主干中呈现 html 不起作用

java - Java 8 中带有 2 个箭头的 lambda 是什么意思?

functional-programming - ML 函数柯里化(Currying)