ru.javascript.info
ru.javascript.info copied to clipboard
Исправление ошибки в функции карирования
trafficstars
Описание
В примере учебника функции карирования явно добавлен метод apply, указывающий, что мы должны помнить о контексте. Но пример не учел, что возвращаемую рекурсивно функцию curried так же оборачивают в анонимную функцию, у которой свой контекст this, из-за чего происходит потеря изначального контекста и пример работает не правильно. Замена анонимной функции на стрелочную решает проблему, так как стрелочная функция не имеет своего this, и берет его у своего родителя.
Вот пример где ошибку легко воспроизвести
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return function(...args2) {
return curried.apply(this, args.concat(args2));
}
}
};
}
function testFn(biba, boba) {
return this.prefix + biba + ', ' + boba;
}
const obj = {
prefix: "Mokss: ",
test: curry(testFn)
};
console.log(obj.test("Biba")("Boba")); // undefinedBiba, Boba
Пример с фиксом, где код работает ожидаемо
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return (...args2) => {
return curried.apply(this, args.concat(args2));
}
}
};
}
function testFn(biba, boba) {
return this.prefix + biba + ', ' + boba;
}
const obj = {
prefix: "Mokss: ",
test: curry(testFn)
};
console.log(obj.test("Biba")("Boba")); // Mokss: Biba, Boba