Оба partial
и compose
являются функциями высшего порядка .
isUndefined
вернет функцию, которая при вызове вызовет первоначально переданную функцию с исходными аргументами плюс любые новые аргументы, переданные при вызове.
Чтобы ответить на ваш вопрос, вы будете вызывать apply
для функции, возвращаемой из partial
, что, в свою очередь, вызовет apply
для функции, первоначально переданной в partial
.
Вы хотите, чтобы compose
возвратил функцию, которая при вызове вернет результат вызова первой функции, переданной второй функции в качестве аргумента (вторая функция передала аргументы, переданные в вызов compose
). Если compose
вернул func1(func2)
, вы бы присвоили результат вызова переменной isDefined
.
EDIT:
Теперь, когда у нас есть op
, давайте попробуем разобрать это:
var isUndefined = partial(op["==="], undefined);
это эквивалентно
var isUndefined = partial(function(a, b){return a === b;}, undefined);
isUndefined
назначается функция, которая при вызове будет вызывать функцию, переданную в качестве первого аргумента partial
, передавая undefined
в качестве первого аргумента для вызова этой функции, после чего следуют аргументы, передаваемые в функция isUndefined
т.е.
partial(function(a, b){return a === b;}, undefined /* this will become 'a' when isUndefined is invoked */)(argumentForisUndefined /* this will become 'b' when isUndefined is invoked */);
isDefined
создает isUndefined
с другой функцией, которая сводит на нет результат isUndefined
.
var isDefined = compose(op["!"], isUndefined);
эквивалентно
var isDefined = compose(function(a){return !a;}, isUndefined);
, что эквивалентно (переименованы переменные для ясности)
var isDefined = compose(
function(a){return !a;},
partial( /* partial function becomes 'a' passed to first function */
function(b, c) {
return b === c;
},
undefined /* undefined becomes 'b' passed to partial */
)
)(argumentForisDefined /* argumentForisDefined becomes 'c' passed to partial */);
Если мы посмотрим на то, что у нас есть, и заменим читабельность, сводимся к функции, которая принимает аргумент и сравнивает его с неопределенным, отрицает результат и возвращает логическое значение
var isDefined = function (b) { return !undefined === b; }