JavaScript setTimeout在某些对象类型上运行不正常吗?

时间:2011-03-28 22:45:14

标签: javascript object settimeout

最好用代码示例解释这个......

Object_A = {
  testLoop:function(){
             log("running");
             setTimeout(Object_A.testLoop, 1000);
           }
};

Object_B = function(){
  this.testLoop= function(){
    log("running");
    setTimeout(this.testLoop(), 1000);
  }
}

Object_A.testLoop(); // logs message to console every 1000ms, as you would expect

var objB = new Object_B();
objB.testLoop(); // runs infinitely at once (no 1000ms interval) until "Maxium call stack size exceeded"

为什么循环在静态对象中工作正常但在声明生成函数的“类类”对象中却没有?

(旁注:这两种对象的正确名称是什么?我一直说“satic”和“非静态”对象,但我觉得这是不正确的。)

3 个答案:

答案 0 :(得分:2)

函数是JavaScript中的一等公民。给定一个如下定义的函数:

function foo()
{
    return 0;
}

这有不同之处:

var result = foo();

和此:

var result = foo;

第一个调用名为foo的函数,并将该调用返回的值赋给result。在这种情况下,result将等于零。

第二个将result分配给名为foo的函数。现在,result不等于零; result等于函数foo

您现在在代码中看到了问题吗?

答案 1 :(得分:1)

setTimeout(this.testLoop(), 1000);应该是setTimeout(this.testLoop, 1000);,因为你想要的是函数,而不是它的返回值。

答案 2 :(得分:1)

更改此行

setTimeout(this.testLoop(), 1000);

setTimeout(this.testLoop, 1000);