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