1

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

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

问题:
第一个“步骤”由我的 html 页面的 <body> 标记中的 onload 事件(属性)运行(但间接地:Step.run由调用的函数initiateJS()调用 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
  • 4

    2 回答 2

    1

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

    编辑:既然你说Step是全球性的,这应该工作:

    run: function() {
        //run the registered functions
        setTimeout(Step.run, Step.interval);
    }
    
    于 2012-05-03T22:58:16.617 回答
    1

    将您的运行功能更改为:

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

    setTimeout 函数重新定义了this变量,这是我能想到的解决此问题的最简单方法。

    于 2012-05-03T22:54:36.170 回答