Я заметил, что вызовы типа setTimeout()
работают либо как:
self.keyword()
или просто по своему усмотрению, например. keyword()
.
В чем разница между двумя вызовами?
Я заметил, что вызовы типа setTimeout()
работают либо как:
self.keyword()
или просто по своему усмотрению, например. keyword()
.
В чем разница между двумя вызовами?
self
может ссылаться на объект окна, но обычно это не так. Вы увидите это обычно выше setTimeout()
:
var self = this;
Они сохраняют ссылку на текущий объект, поэтому позже, когда вы вызываете self.keyword()
, вы вызываете этот метод на этом объекте, а не другом.
Скажите, что у вас есть изображения на странице, которую вы хотели повернуть каждые 2 секунды... вы хотите, чтобы каждый из этих трех таймеров ссылался на свои собственные методы. Если они используют this
напрямую, это будет (в большинстве случаев) относиться к window
, а не к текущему объекту, тогда как передача другой переменной в поддерживает текущую ссылку.
Он работает с 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]
Каждое свойство и метод объекта 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"