Ошибка вызова javascript setTimeout - PullRequest
7 голосов
/ 24 мая 2011

Я хочу вызвать функцию window.setTimeot с моей настраиваемой областью действия, поэтому я использую метод call, но что-то не так.

function foo() {
    this.bar = function() {
        console.log("keep going");
        window.setTimeout.call(this,this.bar,100);
    }
    this.bar();
}

new foo;

в Firefox выводит на консоль только 1 строку, а затем ничего, а в Google Chrome выдает TypeError.

В чем проблема в моем коде?

1 Ответ

8 голосов
/ 24 мая 2011

Использование call здесь не помогает: оно вызывает setTimeout с вашим this объектом, но сама функция обратного вызова все еще вызывается из глобальной области. То, что вы действительно хотите сделать, это что-то вроде этого:

function foo() {
    var self = this;
    this.bar = function() {
        console.log("keep going");
        window.setTimeout(function() { self.bar(); }, 100);
    }
    this.bar();
}

Редактировать: Если вы действительно хотите что-то похожее на подход call, вы можете использовать bind, который связывает значение this для функции:

window.setTimeout(this.bar.bind(this), 100);

Однако это часть новой спецификации ECMAScript 5, которая еще не поддерживается всеми браузерами.

...