Подтвердить что ты не робот

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

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

self.keyword()

или просто по своему усмотрению, например. keyword().

В чем разница между двумя вызовами?

4b9b3361

Ответ 1

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

var self = this;

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

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

Ответ 2

Он работает с setTimeout из-за двух условий в браузере:

  • Все глобальные переменные являются свойствами объекта window. Это означает, что window имеет свойство setTimeout (window.setTimeout).
  • Объект window имеет свойство self, которое указывает на себя.

Как вы можете получить доступ к свойствам window без явной записи window (что делает глобальные переменные глобальными), оба вызова работают: setTimeout() будет искать свойство setTimeout() в объекте window. self.setTimeout() будет искать свойство self объекта window, являющегося сами объектом окна.

Итак, если вы вызываете self.setTimeout(), то он совпадает с window.self.setTimeout(), который совпадает с window.setTimeout(), который снова совпадает с setTimeout().

Примечание. Это работает только в том случае, если в текущей области нет переменной self, которая затеняет глобальный self.

Это работает с любым символом (значением переменной или функции), определенным в глобальной области. Вы можете проверить его самостоятельно:

alert(window.self);

и

alert(self);

должны оба оповещать

[object Window]

Ответ 3

Каждое свойство и метод объекта window можно вызвать с помощью или без окна.

и

self - свойство только для чтения в объекте window, которое возвращает само окно (MDN)

так

setTimeout()

window.setTimeout()

window.self.setTimeout()

self.setTimeout()

- все то же самое.

Главное преимущество self.setTimeout() вместо window.setTimeout() или любого другого способа заключается в том, что если вы запустите некоторый код, который вызывает window.setTimeout() внутри WebWorker, он потерпит неудачу, но self.setTimeout() будет работать как у веб-работников и контекст браузера. Поэтому, если вы пишете библиотеку, которая должна работать как в области основного окна, так и у веб-рабочего, мы должны использовать self.

self всегда ссылаются на GlobalScope, который в случае режима браузера window, а внутри веб-работников - "WorkerGlobalScope"