Почему обратный вызов JavaScript вызывается только после регистрации?
Я делаю игру с использованием фазера. Я использую Web Speech API для преобразования текста в речь. Это часть моего кода:
Функция, которую я написал для использования Web Speech API:
Game.speech = window.speechSynthesis;
Game.speak = function(s, cb) {
var text = new SpeechSynthesisUtterance(s);
text.pitch = 0.3;
text.rate = 0.75;
if (cb) {
text.onend = cb;
}
Game.speech.speak(text);
}
Код (в другом объекте), который использует функцию:
setTimeout(() => Game.speak(this.introText, this.enterShip.bind(this)), 3000);
Я заметил две вещи, которые мешают мне:
Во-первых, если я не использую bind
функция с обратным вызовом, переданным Game.speak
код выполняется, но, очевидно, возвращает ошибку из-за измененного контекста.
Во-вторых, если я использую bind
функция обратного вызова не запускается.
Поэтому я попытался зарегистрировать обратный вызов, чтобы убедиться, что он был там, вот так:
if (cb) {
text.onend = cb;
console.log(text.onend);
}
Код работал нормально! Так что это, очевидно, работает, но я хочу убедиться, почему. Почему мой обратный вызов вызывается только когда я его регистрирую?