ru.javascript.info icon indicating copy to clipboard operation
ru.javascript.info copied to clipboard

Исправление ошибки в функции карирования

Open Mokss opened this issue 7 months ago • 1 comments
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

Mokss avatar Apr 05 '25 17:04 Mokss

CLA assistant check
All committers have signed the CLA.

CLAassistant avatar Apr 05 '25 17:04 CLAassistant