Я заметил, что вызовы типа 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"