浏览器告诉我'Task.prototype.start''this.clear'未定义... 这是类(函数)及其原型:
function Task(_func, _ms, _repeats, _args)
{
if (typeof _func != 'function') throw '_func is not `function`';
if (typeof _ms != 'number') throw '_ms is not `number`';
if (typeof _repeats != 'number') _repeats = 0; // default: no repeats, run once. optional
// _args is optional
this.func = _func;
this.ms = _ms;
this.repeats = _repeats;
this.args = _args;
this.tID = 0;
this.runCounter = 0;
}
Task.prototype.isRunning = function()
{
return (this.tID != 0);
};
Task.prototype.runsOnce = function(){
return (this.repeats == 0);
};
Task.prototype.clear = function()
{
if (this.isRunning())
{
if (this.runsOnce())
{
clearTimeout(this.tID);
}
else
{
clearInterval(this.tID);
}
}
this.tID = 0;
this.runCounter = 0;
};
Task.prototype.start = function()
{
this.clear();
var _this = this;
var _exec = function()
{
if (_this.runsOnce())
{
_this.func(_this.args);
_this.clear();
}
else
{
if (_this.runCounter > 0)
{
_this.runCounter--;
_this.func(_this.args);
}
else if (_this.runCounter == -1)
{
_this.func(_this.args);
}
else
{
_this.clear();
}
}
};
if (this.runsOnce())
{
this.runCounter = 0;
this.tID = setTimeout(_exec, this.ms);
}
else
{
this.runCounter = this.repeats;
this.tID = setInterval(_exec, this.ms);
}
}
编辑:我如何使用它......
Task.tasks = {};
Task.exists = function(_ID)
{
return (_ID in Task.tasks);
}
Task.create = function(_func, _ms, _repeats, _args, _ID)
{
if (Task.exists(_ID)) return;
Task.tasks[_ID] = new Task(_func, _ms, _repeats, _args);
}
Task.start = function(_ID)
{
if (!Task.exists(_ID)) return;
Task.tasks[_ID].start();
}
Task.clear = function(_ID)
{
if (!Task.exists(_ID)) return;
Task.tasks[_ID].clear();
}
//test task
__task = new Task(function(a){console.log( (new Date()).getTime()+': '+a ) }, 2000, 0, '[args]');
答案 0 :(得分:0)
如果您在.start()
方法中收到该错误,那么这是因为this
值不是它应该的值。并且,由于您调用.start()
方法的方式,可能会出现该问题。既然您没有告诉我们您如何调用.start()
方法,那么我们无法专门解答那里的问题。但是,您需要确保使用obj.start()
形式调用它,其中obj
是Task
对象。
这方面的一个常见错误是将obj.start
作为回调传递,并且没有意识到任何调用回调的人都不会将其调用为obj.start()
。
请说明您如何致电.start()
,以便我们更具体地提供帮助。
答案 1 :(得分:0)
你的代码很好。确保使用new
:
var task = new Task(...);
task.start();
可能你在做:
var task = Task(...);
不会创建导致错误的正确this
值。
干杯