【问题标题】:setTimeout is not being called(?)setTimeout 没有被调用(?)
【发布时间】:2010-12-27 02:11:19
【问题描述】:

问题是我的数组是 [[][][]] 而不是 [[]] :/

这是我的脚本

function loopobject(array) {
    var me = this;
    this.array = array;
    this.loop = function() {
        counter = 0;
        while(array.length > counter) {
            window[array[counter]]('arg1', 'arg2');
            counter++;
        }
        setTimeout(function(){ me.loop() }, 100);
    }
}

var loopinstant = new loopobject(array);
window.onload = loopinstant.loop();

第一次迭代后出现问题。我不知道确切的问题,但我想知道它是否是由于 this 在对象内部,并且一旦重新创建函数它就不会记住数组?

【问题讨论】:

  • 不要更改问题。您可以添加它,但是当您修改原始内容时,答案不再有意义。

标签: javascript settimeout


【解决方案1】:

不要将字符串传递给setTimeout

将字符串传递给setTimeout 会使其在全局范围内为evaled。
除了不必要的缓慢之外,这意味着它不会看到您的局部变量,包括 loop 变量。

相反,您应该将函数本身传递给setTimeout

setTimeout(function() { loop(array); }, 100);

此外,loopobject 实际上并没有您可以稍后调用的 loop 属性。
要创建属性,请将其更改为 this.loop = function(...) { ... }

请注意,setTimeout 回调不会被正确的 this 调用。
您还需要在局部变量中保存this 的副本。

最后,您的window.onload 代码将调用 loop,然后将结果分配给onload

纠正这些问题,你的代码变成了

function loopobject(){
    var me = this;
    this.loop = function(array){
        counter = 0;
        while(array.length > counter){
            window[array[counter]]('arg1', 'arg2');
            counter++;
        }
        setTimeout(function() { me.loop(array); }, 100);
    };
}
var loopinstant = new loopobject();
window.onload = function() { loopinstant.loop(array); };

【讨论】:

  • 我可能有点过于简化了,因为我意识到我的循环实际上是从对象中获取数组。但无论出于何种原因,它仍然表现不佳:/我做了你的建议。我很高兴我摆脱了 eval 函数,非常感谢它
  • @Sam:你的问题可能是counter = 0。为每个 call 运行;您可能需要将其移动到外部函数中。
  • 确实有道理,让我试试。不,显然它仍然不是一个功能。我将尝试将数组更改为外部函数
  • mah,这没有什么区别,因为两者都存储在对象中。我不太清楚你的意思
  • 我不知道你的第二句话说了什么。
【解决方案2】:

替换

setTimeout("loop()", 100);

setTimeout(function() { loop(array); }, 100);

【讨论】:

  • 我很欣赏对评估的洞察力,我什至不知道我在使用它
猜你喜欢
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
相关资源
最近更新 更多