3

我写了以下函数。

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

4 回答 4

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

你可以阅读更多关于bind

于 2012-04-17T14:52:02.197 回答
5

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

例子:

var self = this;
setTimeout(function(){
    self.catch();
},1000);
于 2012-04-17T14:51:56.220 回答
1

使用闭包

obj.prototype.do = function()
{ 
     window.setTimeout((function(that){
        return function(){
            that.catch();
        };
     })(this),1000);
     alert('called');
}
于 2012-04-17T14:51:27.140 回答
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();​
于 2012-04-17T14:55:37.053 回答