JavaScript setTimeout отлично работает на одних типах объектов, а не на других? - PullRequest
0 голосов
/ 29 марта 2011

Это лучше всего объяснить на примере кода ...

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"

Почему цикл прекрасно работает в статическом объекте, а не в "классоподобном" объекте, который объявляет генерирующую функцию?

(на sidenote: каково правильное название для этих двух типов объектов? Я продолжаю говорить "сатиничные" и "нестатические" объекты, но я чувствую, что это неправильно.)

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

Функции являются первоклассными гражданами в JavaScript. Учитывая функцию, определенную так:

function foo()
{
    return 0;
}

Существует разница между этим:

var result = foo();

и это:

var result = foo;

Первый вызывает функцию с именем foo и присваивает значение, возвращаемое этим вызовом, result. В этом случае result будет равно нулю.

Второй присваивает result функции с именем foo. Теперь result не равно нулю; result соответствует функции foo.

Вы видите проблему в своем коде сейчас?

1 голос
/ 29 марта 2011

изменить эту строку

setTimeout(this.testLoop(), 1000);

до

setTimeout(this.testLoop, 1000);
1 голос
/ 29 марта 2011

setTimeout(this.testLoop(), 1000); должно быть setTimeout(this.testLoop, 1000);, как вы хотите, чтобы функция, а не ее возвращаемое значение.

...