Я заметил что вызовы как setTimeout()
работайте любой как:
self.keyword()
или просто самостоятельно, например. keyword()
.
Каково различное между двумя вызовами?
self
может ссылаться на объект окна, но обычно это не тот случай. Вы увидите это обычно выше, что setTimeout()
:
var self = this;
Они сохраняют ссылку на текущий объект, поэтому позже, когда вы вызываете self.keyword()
, вы вызываете этот метод на этом объекте, а не на каком-либо другом.
Допустим, у вас есть изображения на странице, которые вы хотите вращать каждые 2 секунды... вы хотите, чтобы каждый из этих 3 таймеров ссылался на свои собственные методы. Если они используют this
напрямую, он (в большинстве случаев) будет ссылаться на window
, а не на текущий объект, тогда как передача другой переменной сохранит текущую ссылку.
Это работает с setTimeout
из-за двух условий в браузере:
window
. Это означает, что window
имеет свойство setTimeout
(window.setTimeout
). window
имеет свойство self
, которое указывает на него самого. Поскольку вы можете получить доступ к свойствам window
без явного написания window
(именно это делает глобальные переменные глобальными), оба вызова работают: setTimeout()
будет искать свойство setTimeout()
на объекте window. self.setTimeout()
будет искать свойство self
на объекте window
, который является самим объектом window.
Поэтому если вы вызовете self.setTimeout()
, это будет то же самое, что window.self.setTimeout()
, что то же самое, что window.setTimeout()
, что опять же то же самое, что setTimeout()
.
Примечание: Это работает, только если в текущей области видимости не определена переменная self
, которая затеняет глобальную self
.
Это работает с любым символом (имеется в виду переменная или функция), определенным в глобальной области видимости. Вы можете проверить это сами:
alert(window.self);
и
alert(self);
оба должны предупредить
[object Window]