Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.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';dojo类中的setTimeOut_Javascript_Dojo_Settimeout - Fatal编程技术网

调用JavaScript';dojo类中的setTimeOut

调用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=

我正在尝试将JavaScript函数转换为dojo类。我的一个JS方法中有一个
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也有绑定。