#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
onsetTimeout
, потому что вы пытаетесь изменить неthis
ofsetTimeout
, а скорее функцию, которую вы передаете в качестве аргумента. приветствия