Функция не работает при передаче в качестве аргумента [duplicate]

1

У меня есть код, который выглядит так:

function doStuff(args) {
    // do stuff
    globalFunction(foo);
}

Я хочу реорганизовать свой код, передав глобальную функцию в качестве аргумента, так что, если глобальная функция изменится, я могу просто изменить то, что передается моей функции:

function doStuff(args, fn) {
    // do stuff
    fn(foo);
}

Но по какой-то странной причине функция теперь ведет себя по-другому, и я получаю ошибку где-то в ней. Я даже сделал это, чтобы проверить, правильно ли я передаю его:

function doStuff(args, fn) {
    // do stuff
    console.log(globalFunction === fn); // true
    fn(foo);
}

Поэтому я определенно знаю, что это правильная функция. Я действительно смущен этим. Может ли кто-нибудь дать мне представление о том, что происходит?

EDIT: Это только стало более странным. У меня теперь есть следующее:

function doStuff(args) {
    // do stuff
    globalFunction(foo); // works
    const fn = globalFunction;
    fn(foo); // doesn't work (???)
}

Может быть, это что-то особенное для этой функции. В принципе, функция находится в классе, и в ней есть ссылки на это в ее теле. Когда я запускаю код нормально, это нормально, но когда я запускаю его из назначенной переменной, я получаю сообщение об ошибке, когда это не определено. Я бы опубликовал весь код, но это часть внешней библиотеки, которая огромна, поэтому я стараюсь обобщить ее.

EDIT 2:

Я думаю, что я выделил проблему. Если у меня есть код вроде

class foo {
    a() {
        console.log(this);
    }
}

Тогда const bar = new foo(); bar.a(); const bar = new foo(); bar.a(); logs foo. Однако, если я выполняю const fn = bar.a а затем вызываю bar.a(), я получаю undefined. Почему это происходит?

  • 0
    Где определяется foo ? Вы имеете в виду fn(args) ?
  • 0
    какую ошибку вы получаете?
Показать ещё 17 комментариев
Теги:

1 ответ

1
Лучший ответ
const fn = bar.a

создает новую ссылку на функцию, которая не совпадает с bar.a Ты можешь использовать

fn.call(bar /* args */);

чтобы установить this в bar в fn() вызов

class foo {
  a() {
    console.log(this, ...arguments);
  }
}

const bar = new foo();

const fn = bar.a;

fn.call(bar, 123);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню