背景
我编写了一个名为Step
的javascript对象来实现我可能需要为我的网站使用的任何操作的步骤类型事件,例如:平滑运动功能。我可以使用Step对象的方法registerFunction(func)
注册函数来运行每一步。
为了处理每一步运行函数,Step对象有另一个名为run()
的方法。
在这个方法中,我运行已注册函数列表,运行它们,然后然后调用setTimeout(...)
函数,将引用传递给run函数以调用它以进行下一步。
问题:
第一个“步骤”由< body>中的onload事件(属性)运行。我的html页面的标签(间接地,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
对象仍然存在。
其他一些细节:
答案 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}}