I. Чтобы разобраться, вставьте повсюду
console.log()
.
Так узнаете, где
this
– ваш объект, а где становится «вдруг»
window
:
console.log("внутри timeout", this);
II. Освежите отличия
стрелочных функций (callback) => { ... }
от обычных
function() { ... }
В исходном коде
this.response = function() { .. тут собственный this.. }
Когда передаёте аргументом
..(t.response)
, он улетает из контекста Window, поэтому в нём
this == window
.
Попробуйте использовать стрелочную функцию:
this.response = () => { .. тут this на момент обращения к нему .. }
III. Посмотрите на исходный код и скажите, что раньше исполнится:
callback()
или
this.data = "Steve Jobs"
?
Вот так, вроде бы, работает, как ожидается. С минимальными изменениями:
spoilerfunction test() {
this.data = null;
this.response = function() {
console.log(this, this.data);
}
this.connect = function(callback) {
setTimeout(() => {
this.data = "Steve Jobs";
callback.call(this);
}, 500);
}
}
t = new test();
t.connect(t.response);