Js 柯里化条件

Js currying with condition

我很长时间以来一直在努力理解这段代码,我知道柯里化函数,但对这段代码感到困惑,请解释背后的理论

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。 因为它 return 是一个函数,所以可以像代码中显示的那样调用它 currying(find)([1,2,3])

我们来看这部分,currying(find)([1,2,3])。 它执行 currying 的 returned 方法。它可以使用关键字 arguments 访问参数,即代码中 [1,2,3] 的数组。

参数是数组,表示它有长度值。然后参数被推入 args 数组和 return 它的被调用者,这意味着 currying.

的内部方法

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