ошибка вызова javascript setTimeout

#javascript #scope #call #settimeout #invoke

#javascript #область видимости #вызов #settimeout #вызвать

Вопрос:

Я хочу вызвать 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:

Использование 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, которая еще не поддерживается всеми браузерами.

Комментарии:

1. спасибо, я знаю, что этот способ работает, я пытаюсь использовать call .

2. @omnosis: Вы не можете использовать call для этой цели. То, что вы ищете, это bind , которое является частью новой спецификации ECMAScript 5. Используя это, вы можете сделать что-то вроде этого: window.setTimeout(this.bar.bind(this), 100) .

3. имеет смысл. Я допустил ту же ошибку, не имеет смысла использовать call on setTimeout , потому что вы пытаетесь изменить не this of setTimeout , а скорее функцию, которую вы передаете в качестве аргумента. приветствия