调用JavaScript';dojo类中的setTimeOut
我正在尝试将JavaScript函数转换为dojo类。我的一个JS方法中有一个调用JavaScript';dojo类中的setTimeOut,javascript,dojo,settimeout,Javascript,Dojo,Settimeout,我正在尝试将JavaScript函数转换为dojo类。我的一个JS方法中有一个setTimeOut(“functionName”,2000)。如何使用dojo.declare方法从类decard中的方法调用它。例如,下面是我的自定义类 dojo.declare("Person",null,{ constructor:function(age,country,name,state){ this.age=
setTimeOut(“functionName”,2000)
。如何使用dojo.declare方法从类decard中的方法调用它。例如,下面是我的自定义类
dojo.declare("Person",null,{
constructor:function(age,country,name,state){
this.age=age;
this.country=country;
this.name=name;
this.state=state;
},
moveToNewState:function(newState){
this.state=newState;
//I need to call "isStateChanged" method after 2000 ms. How do I do this?
setTimeOut("isStateChanged",2000);
},
isStateChanged:function(){
alert('state is updated');
}
});
var person=new Person(12,"US","Test","TestState");
person.moveToNewState("NewState");
请告诉我如何在2000毫秒后从
moveToNewState
方法调用isStateChanged
方法。您想要的是一种将此
值绑定到setTimeout
将调用的函数的方法:
moveToNewState:function(newState){
// Remember `this` in a variable within this function call
var context = this;
// Misc logic
this.state = newState;
// Set up the callback
setTimeout(function() {
// Call it
context.isStateChanged();
}, 2000);
},
上面使用的是一个闭包来绑定上下文(请参见:),这是通常的方法。Dojo可以提供一个内置函数来生成这些“绑定”回调(Prototype和jquerydo)。(编辑:确实如此,他在下面的评论中亲切地指出。)
关于这个一般概念的更多信息:这与dojo无关,这是纯javascript。您需要的是:
var $this = this;
setTimeout(function() { $this.isStateChanged() }, 2000);
退房
哦,还有,请不要在函数名周围使用引号(因为这会使它成为一个无用的字符串,可能会得到
eval
ed并给出错误)。您只需调用setTimeout(this.isStateChanged,2000)
,它将传递正确的函数引用,与您直接调用该方法的方式不同。表达式this.isStateChanged
将立即计算。要进行调用,无需将其封装在额外的函数中或声明局部变量
要将
this
变量绑定到被调用函数,您可以使用它创建自己的闭包,而不会污染局部变量空间并可能通过其他引用泄漏。您可以使用dojo/\u base/lang并使用其挂接方法,如以下代码所示:
moveToNewState:function(newState){
// Misc logic
this.state = newState;
// Set up the callback
setTimeout(lang.hitch(this, function() {
// Call with `this`
this.isStateChanged();
}), 2000);
},
它是
setTimeout
,而不是setTimeout
,最好(总是或几乎总是)向它传递函数引用,而不是它必须编译的字符串。非常感谢您的回复。成功了。为什么我们要创建一个名为$this的新变量,然后将当前对象分配给它?我认为“this”将引用“Person”对象,它有一个方法“isStateChanged”this
确实引用了Person
实例,但仅在moveToNewState
闭包中。触发超时时,它的上下文(读取:此
魔术变量)将不是个人
实例,而是窗口
。这就是为什么需要将实例存储在不同名称的变量中。T.J.Crowder发布了一些关于这个问题的好链接。非常感谢Felix的友好回复非常感谢你的回复。成功了。为什么我们要创建一个名为context的新变量,然后将当前对象分配给它?我认为“this”指的是“Person”对象,它有一个方法“isStateChanged”@Steven:“为什么我们要创建一个名为context的新变量,然后将当前对象分配给它?”因为这个(在JavaScript中)完全是由函数的调用方式定义的,而不是函数的定义位置setTimeout
在全局上下文中调用函数,这在浏览器上意味着此
将是窗口
,这显然不是您想要的。在上面的链接和这里有更多内容:在这种情况下,闭包实际上是不必要的,但是对于绑定变量来说,闭包是Dojo的等价物。@peller:啊,好了,谢谢。我知道Dojo会有一个。记住,不管怎样,都会有一个闭包,这只是它关闭什么的问题——jQuery的代理
、Prototype的绑定
、Dojo的挂接
都会创建闭包,但它们的实现方式很好,库代码中包含了很好的作用域,因此闭包不会不必要地在内存中保留任何附加内容。+1 True,必须包含闭包,至少如果您希望在调用的函数中引用“this”。对不起,我意识到我的反对票太仓促了。堆栈溢出不允许我撤消它们:-/FWIW,现在ES5也有绑定。