我有一个javascript范围错误,我不知道如何解决这个问题

时间:2014-01-06 23:59:13

标签: javascript function class prototype

浏览器告诉我'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]');

2 个答案:

答案 0 :(得分:0)

如果您在.start()方法中收到该错误,那么这是因为this值不是它应该的值。并且,由于您调用.start()方法的方式,可能会出现该问题。既然您没有告诉我们您如何调用.start()方法,那么我们无法专门解答那里的问题。但是,您需要确保使用obj.start()形式调用它,其中objTask对象。

这方面的一个常见错误是将obj.start作为回调传递,并且没有意识到任何调用回调的人都不会将其调用为obj.start()

请说明您如何致电.start(),以便我们更具体地提供帮助。

答案 1 :(得分:0)

你的代码很好。确保使用new

进行设置
var task = new Task(...);
task.start();

可能你在做:

var task = Task(...);

不会创建导致错误的正确this值。

干杯