Illegal invocation TypeError: Illegal invocation
は、可変コールバックでsetTimeout
を呼び出すとスローされます。これは、this
がコールバック内の別のオブジェクトを参照し、bind
または矢印関数がこれを解決するために使用されている場合に発生することがあります。ただし、私のコールバックにはthis
はありません。次のようにsetTimeout不正な呼び出しTypeError:不正な呼び出し
コードは次のとおりです。私はバベルとes2015を使用
class AlarmService {
constructor(callback) {
this._alarms = {};
this.setTimeout = window.setTimeout;
this.clearTimeout = window.clearTimeout;
this._callback = callback || function() {};
}
create(alarmName, when, title, message) {
this._alarms[alarmName] = {
'title': title,
'message': message
};
this._alarms.timeout = this.setTimeout(this._callback, when - Date.now(),
this._alarms[alarmName]);
}
}
let alarms = new AlarmService(function (alarm) {
console.log('Alarm', alarm.name);
});
// Exception is thrown here
alarms.create('alarmName', Date.now() + 3000, 'Title', 'Message');
注意。
機能であるあなたがあなた自身のオブジェクトへのそれへの参照をコピーしたため、エラーを投げ、その後、あなたは 'このよう独自のオブジェクトでそれを呼び出しています'文脈。コールバックが 'this'を参照していないことに違いはありません。問題は 'window.setTimeout()'の代わりに 'this.setTimeout()'を呼び出すことです。 – Pointy