使用javascript setTimeout导致对象内的数据丢失?

时间:2012-05-03 22:52:06

标签: javascript settimeout

背景
我编写了一个名为Step的javascript对象来实现我可能需要为我的网站使用的任何操作的步骤类型事件,例如:平滑运动功能。我可以使用Step对象的方法registerFunction(func)注册函数来运行每一步。

为了处理每一步运行函数,Step对象有另一个名为run()的方法。 在这个方法中,我运行已注册函数列表,运行它们,然后然后调用setTimeout(...)函数,将引用传递给run函数以调用它以进行下一步。

问题:
第一个“步骤”由< body>中的onload事件(属性)运行。我的html页面的标签(间接地,Step.runinitiateJS()调用的函数onload调用。第一步没有出错。但是,通过第二步,Step对象中的变量似乎已被处理掉;它们都变得不明确。

问题:
我以为这可能是由于垃圾收集器?也许它以某种方式失去了它的参考? 另外,使用setTimeout(...)甚至是制作步骤类型事件实现的最佳方法?

详细信息:
Step对象在js文档中声明为:

    var Step = {
            myVars: "somevalues",
            anArray: [],
            run: function() {
                //run the registered functions
                setTimeout(this.run,this.interval);
        };

另外,在下一步中,Step对象仍然存在。

其他一些细节:

  • 我正在使用Chrome
  • 我正在使用XAMPP制作我的网站
  • 我正在使用Windows 7
  • 2 个答案:

    答案 0 :(得分:1)

    将运行功能更改为:

    run: function() {
        var that = this;
        setTimeout(that.run, that.interval);
    }
    

    setTimeout函数redefines the this variable,这是我能想到解决这个问题的最简单方法。

    答案 1 :(得分:1)

    setTimeout在全局上下文中运行代码。 this下次run()执行时不再定义Step。您需要重构代码,以在某种全局对象上声明变量,或者将引用传递给run函数本身。

    编辑:既然你说run: function() { //run the registered functions setTimeout(Step.run, Step.interval); } 是全局的,那应该可行:

    {{1}}