Когда использовать сам в JavaScript

Я заметил что вызовы как setTimeout() работайте любой как:

self.keyword()

или просто самостоятельно, например. keyword().

Каково различное между двумя вызовами?

32
задан Konrad 22 July 2010 в 13:54
поделиться

2 ответа

self может ссылаться на объект окна, но обычно это не тот случай. Вы увидите это обычно выше, что setTimeout():

var self = this;

Они сохраняют ссылку на текущий объект, поэтому позже, когда вы вызываете self.keyword(), вы вызываете этот метод на этом объекте, а не на каком-либо другом.

Допустим, у вас есть изображения на странице, которые вы хотите вращать каждые 2 секунды... вы хотите, чтобы каждый из этих 3 таймеров ссылался на свои собственные методы. Если они используют this напрямую, он (в большинстве случаев) будет ссылаться на window, а не на текущий объект, тогда как передача другой переменной сохранит текущую ссылку.

31
ответ дан 27 November 2019 в 20:51
поделиться

Это работает с 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]
12
ответ дан 27 November 2019 в 20:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: