JS карри с условием - PullRequest
       23

JS карри с условием

0 голосов
/ 23 апреля 2019

я пытаюсь понять этот код в течение долгого времени, я знаю функцию карри, но путаюсь с этим кодом, пожалуйста, объясните теорию

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 Ответ

2 голосов
/ 23 апреля 2019

Чтобы было легче объяснить, давайте преобразуем последнюю часть кода:

// 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 в currying равно find. Поскольку она возвращает функцию, она может быть вызвана так, как показано в коде 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, поэтому вы должны вызывать его как функцию. добавьте () в конце, чтобы выполнить функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...