У меня есть код, который выглядит так:
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
. Почему это происходит?
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);
foo
? Вы имеете в видуfn(args)
?