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);