Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript setTimeout('classInstance.doFoo(arg)'750);行不通_Javascript_Class_Instance_Settimeout - Fatal编程技术网

Javascript setTimeout('classInstance.doFoo(arg)'750);行不通

Javascript setTimeout('classInstance.doFoo(arg)'750);行不通,javascript,class,instance,settimeout,Javascript,Class,Instance,Settimeout,我试图以750ms的延迟调用实例的方法。问题是,它不起作用。我读到过setInterval和对象有一些问题,所以setTimeout也可能有一个问题 假设我有这个: function App() { this.doFoo = function (arg) { alert("bar"); } } window.app = new App(); setTimeout('app.doFoo(arg)', 750);//doesn't work

我试图以750ms的延迟调用实例的方法。问题是,它不起作用。我读到过setInterval和对象有一些问题,所以setTimeout也可能有一个问题

假设我有这个:

function App()
{
      this.doFoo = function (arg)
      {
          alert("bar");
      }
}

window.app = new App();
setTimeout('app.doFoo(arg)', 750);//doesn't work
app.doFoo(arg); //works
有解决办法吗?如何将实例和函数传递给setTimeout?

尝试如下操作:

function App()
{
    this.doFoo = function (arg) {
        alert(arg);
    }
}

window.app = new App();
window.setTimeout(function() {
    window.app.doFoo('arg');
}, 750);
试着这样做:

function App()
{
    this.doFoo = function (arg) {
        alert(arg);
    }
}

window.app = new App();
window.setTimeout(function() {
    window.app.doFoo('arg');
}, 750);

我认为前面的答案需要稍加修改。设置一个全局变量,然后调用它;如果你真的想调用你的“类”的实例,试试这个

function App(message){
     this.name = 'instance';
     var self = this;
     var x = setTimeout(function(){self.doFoo(message, x);}, 750);
}
App.prototype.name = 'proto';

//creating the function on the prototype is more efficient since it is only created once.  if you do 'this.doFoo = function(){}' it's created for every instance of the function taking more memory.

App.prototype.doFoo = function(arg, timer){
 clearTimeout(timer);
 alert(this.name +' ' + arg)
}

var x = new App("hello world");
//should output ("instance hello world");

我认为前面的答案需要稍加修改。设置一个全局变量,然后调用它;如果你真的想调用你的“类”的实例,试试这个

function App(message){
     this.name = 'instance';
     var self = this;
     var x = setTimeout(function(){self.doFoo(message, x);}, 750);
}
App.prototype.name = 'proto';

//creating the function on the prototype is more efficient since it is only created once.  if you do 'this.doFoo = function(){}' it's created for every instance of the function taking more memory.

App.prototype.doFoo = function(arg, timer){
 clearTimeout(timer);
 alert(this.name +' ' + arg)
}

var x = new App("hello world");
//should output ("instance hello world");

说明:如果将字符串传递给setTimeout,则Javascript必须对其求值以运行代码。evalled代码在与主代码不同的范围内执行,因此变量引用很容易中断。最好将匿名函数传递给setTimeout,这样您的变量就都正确了scope@Gareth,很好的解释,请随意编辑我的答案并包含这些有价值的信息。@Ross:如果你不知道,那就别担心,因为eval造成的问题远比它解决的问题多得多。这是一种获取字符串代码并运行它的方式,就像它是它所表示的实际代码一样。使之复杂的是如何处理局部变量和参数。创建一个匿名函数要容易得多,就像Darin在这里做的那样,它执行相同的操作。解释:如果您将字符串传递给setTimeout,Javascript必须对其求值以运行代码。evalled代码在与主代码不同的范围内执行,因此变量引用很容易中断。最好将匿名函数传递给setTimeout,这样您的变量就都正确了scope@Gareth,很好的解释,请随意编辑我的答案并包含这些有价值的信息。@Ross:如果你不知道,那就别担心,因为eval造成的问题远比它解决的问题多得多。这是一种获取字符串代码并运行它的方式,就像它是它所表示的实际代码一样。使之复杂的是如何处理局部变量和参数。创建匿名函数要容易得多,因为Darin在这里执行相同的操作。