将本地函数传递给setTimeout()

时间:2012-04-17 14:46:59

标签: javascript settimeout local-variables

我写了以下函数。

function obj()
{
     this.a;
}
obj.prototype.catch = function()
{
    alert('Catched')
}
obj.prototype.do = function()
{
    alert('called');
}

我需要的是,在调用obj :: do()之后调用obj :: catch()并且必须从obj :: do()内部执行调用 那么如何将obj的局部函数传递给setTimeout

我试过了

obj.prototype.do = function()
 { 
     window.setTimeout('"'+this.catch+'()"',1000);
     alert('called');
 }

它不起作用 然后我试了

 obj.prototype.do = function()
 { 
     window.setTimeout('"'+this+'.catch()"',1000);
     alert('called');
 }

在Chrome控制台上给了我以下错误

Uncaught SyntaxError: Unexpected token ILLEGAL

所以我尝试了以下脏方法(它真的很脏吗?)

 obj.prototype.do = function()
 { 
     this.pid = randomVal(100);
     window['temp'+this.pid] = this;
     window.setTimeout("temp"+this.pid+".catch();",1000);
     alert('called');
 }
 function randomVal(bound)//returns a random number between 0 and <bound>
 {
       return (Math.floor(Math.random()*(bound)));
 }

那很有效。

那么为什么前两种方法不起作用。没有全局变量,还有其他方法可以做同样的事情。 第二种方法和最后一种方法几乎相似。但为什么我在第二种方法中得到错误..? 工作代码可以在这里找到 http://jsfiddle.net/jXhAs/

4 个答案:

答案 0 :(得分:8)

不要将字符串传递给setTimeout ......永远。

var self = this; // Because the scope will change
setTimeout(function () { self.catch() },1000);

或者如果您使用的是JS 1.8.5:

setTimeout(this.catch.bind(this),1000);

你可以read more about bind

答案 1 :(得分:4)

您应该将函数传递给setTimeout(不是字符串):

示例:

var self = this;
setTimeout(function(){
    self.catch();
},1000);

答案 2 :(得分:1)

使用闭包

obj.prototype.do = function()
{ 
     window.setTimeout((function(that){
        return function(){
            that.catch();
        };
     })(this),1000);
     alert('called');
}

答案 3 :(得分:0)

为什么要完成所有这些工作,只需传递函数。

function obj() {
    this.a;
}
obj.prototype.
catch = function() {
    alert('Catched')
}
obj.prototype.do = function() {
    setTimeout(this.
    catch, 1000);
}

var test = new obj();
test.do();​