Javascript setTimeout('classInstance.doFoo(arg)'750);行不通
我试图以750ms的延迟调用实例的方法。问题是,它不起作用。我读到过setInterval和对象有一些问题,所以setTimeout也可能有一个问题 假设我有这个: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
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在这里执行相同的操作。