有条件的JS

时间:2019-04-23 02:40:51

标签: javascript 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)());

1 个答案:

答案 0 :(得分: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,因此fn中的curryingfind。 当它返回一个函数时,可以按代码currying(find)([1,2,3])

上所示的那样进行调用

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

参数是一个数组,表示它具有长度值。然后将参数推入args数组中并返回其被调用者,这意味着currying的内部方法。

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