Javascript setTimeout非法调用类型错误:非法调用

Javascript setTimeout非法调用类型错误:非法调用,javascript,ecmascript-6,Javascript,Ecmascript 6,非法调用类型错误:使用变量回调调用setTimeout时引发非法调用。我了解到当this引用回调中的另一个对象时会发生这种情况,并且bind或arrow函数用于解决此问题。但是,在我的回调中没有此 代码如下: 类报警服务{ 构造函数(回调){ 这个._alarms={}; this.setTimeout=window.setTimeout; this.clearTimeout=window.clearTimeout; 这个._callback=callback | |函数(){}; } 创建(

非法调用类型错误:使用变量回调调用
setTimeout
时引发非法调用。我了解到当
this
引用回调中的另一个对象时会发生这种情况,并且
bind
或arrow函数用于解决此问题。但是,在我的回调中没有

代码如下:

类报警服务{
构造函数(回调){
这个._alarms={};
this.setTimeout=window.setTimeout;
this.clearTimeout=window.clearTimeout;
这个._callback=callback | |函数(){};
}
创建(报警名称、时间、标题、消息){
此。_报警[报警名称]={
“标题”:标题,
“消息”:消息
};
this.\u alarms.timeout=this.setTimeout(this.\u回调,when-Date.now(),
此._报警[报警名称];
}
}
let alarms=新的AlarmService(功能(报警){
console.log('Alarm',Alarm.name);
});
//这里抛出异常

创建('alarmName',Date.now()+3000,'Title','Message')
您的回调中没有
,但是
设置超时
是全局调用的。
因此,
this.setTimeout
应该是
setTimeout

setTimeout.call(this, function () {
    // this.model.starIcon = "fa-star";
    this._toggleStarIcon()
}, 150);
类报警服务{
构造函数(回调){
这个._alarms={};
this.setTimeout=window.setTimeout;
this.clearTimeout=window.clearTimeout;
这个._callback=callback | |函数(){};
}
创建(报警名称、时间、标题、消息){
此。_报警[报警名称]={
“标题”:标题,
“消息”:消息
};
this._alarms.timeout=setTimeout(this._回调,when-Date.now(),this._alarms[alarmName]);
}
}
let alarms=新的AlarmService(功能(报警){
console.log(“报警”,报警);
});

创建('alarmName',Date.now()+3000,'Title','Message');//异常在此处抛出
在示例代码中,函数setTimeout和clearTimeout在无效上下文中被调用(
)。在可能的情况下,修复程序绑定到正确的上下文(
window
):

通常认为函数中的
这个
对象指向调用中点左边的对象:

alerts.create(...) // inside create(), this === alerts
   ^
   |___ "this"
如果没有点,则取决于调用方函数是否严格:

var create = alerts.create
create() // this === Window or global
^
|_____ no dot

如果调用
setTimeout
时没有点,我们可能会认为
这个
上下文无关紧要。但在浏览器中,若你们用一个点来称呼它,或者使用一个不同于窗口的变量作为上下文传递,它会抱怨

火狐:

未捕获类型错误:非法调用

铬:

TypeError:对未实现接口窗口的对象调用了“setTimeout”


其他人建议坚持通常的
设置超时(fn,timeout)
。 另一种方法是创建匿名函数:

this.setTimeout = (fn, timeout) => setTimeout(fn, timeout);

我得到这个错误是因为我将
想要的上下文
传递给
设置超时
,而不是
它的回调

这是错误的代码,我将
this
传递到
setTimeout

setTimeout.call(this, function () {
    // this.model.starIcon = "fa-star";
    this._toggleStarIcon()
}, 150);
传递上下文的正确方法是将其传递给
setTimeout callback

我过去常这样做

这是正确的代码

setTimeout($.proxy(function () {
    // this.model.starIcon = "fa-star";
    this._toggleStarIcon()
}, this), 150);

希望这对您有所帮助

函数抛出错误,因为您已将对它的引用复制到自己的对象,然后您将使用自己的对象作为
上下文调用它。回调不引用此
,这没有什么区别。问题是您调用的是
this.setTimeout()
,而不是
window.setTimeout()
。或者在没有此反模式代码的情况下使用setTimeout和clearTimeout
setTimeout($.proxy(function () {
    // this.model.starIcon = "fa-star";
    this._toggleStarIcon()
}, this), 150);