Использование методов экземпляра в качестве обратных вызовов для обработчиков событий изменяет область действия this
с «Мой экземпляр» на «Независимо от того, что только что вызвало обратный вызов» . Так что мой код выглядит так
function MyObject() {
this.doSomething = function() {
...
}
var self = this
$('#foobar').bind('click', function(){
self.doSomethng()
// this.doSomething() would not work here
})
}
Это работает, но это лучший способ сделать это? Это выглядит странно для меня.
javascript
jquery
scope
closures
defnull
источник
источник
self
посколькуwindow.self
объект существует, и вы можете случайно использовать его, если забудете объявить свой собственныйself
var (например, при перемещении некоторого кода). Это может раздражать, чтобы обнаружить / отладить. Лучше использовать что-то вроде_this
.this
JavaScript является динамическим в JavaScript. Оно определяется при вызове функции , а не при ее объявлении».self === this
. Поэтомуself
в локальном контексте имеет смысл и следует шаблону.Ответы:
Этот вопрос относится не только к jQuery, но и к JavaScript в целом. Основная проблема заключается в том, как «направить» переменную во встроенные функции. Это пример:
Этот метод основан на использовании замыкания. Но это не работает,
this
потому чтоthis
это псевдопеременная, которая может динамически меняться от области действия к области видимости:Что мы можем сделать? Присвойте его какой-нибудь переменной и используйте через псевдоним:
this
не является уникальным в этом отношении:arguments
это другая псевдопеременная, которая должна обрабатываться таким же образом - с помощью псевдонимов.источник
Да, это похоже на общий стандарт. Некоторые кодеры используют себя, другие используют меня. Он используется как ссылка на «реальный» объект, а не на событие.
Это то, что мне потребовалось немного времени, чтобы действительно получить, сначала это выглядит странно.
Я обычно делаю это прямо в верхней части моего объекта (извините за мой демонстрационный код - он более концептуален, чем что-либо еще и не является уроком по отличной технике кодирования):
источник
edit: несмотря на то, что вложенные функции внутри объекта принимают глобальный объект окна, а не окружающий объект.
источник
var self = this
делает, но это не то, что задает вопрос (вопрос в том, является ли это лучшим решением проблемы).Если вы используете ES2015 или скрипт типа и ES5, то вы можете использовать функции стрелок в своем коде, и вы не столкнетесь с этой ошибкой, и это относится к желаемой области действия в вашем экземпляре.
источник
this
их определяющую область. Обычные определения функций этого не делают.Одним из решений этой проблемы является привязка всего вашего обратного вызова к вашему объекту с помощью
bind
метода javascript .Вы можете сделать это с помощью именованного метода,
Или с анонимным обратным вызовом
Делая это вместо того, чтобы прибегать к
var self = this
демонстрациям, вы понимаете, как привязкаthis
ведет себя в javascript и не зависит от ссылки на закрытие.Кроме того, оператор жирной стрелки в ES6 - это то же самое, что вызов
.bind(this)
анонимной функции:источник
Я не использовал jQuery, но в такой библиотеке, как Prototype, вы можете привязать функции к определенной области. Итак, с учетом этого ваш код будет выглядеть так:
Метод bind возвращает новую функцию, которая вызывает оригинальный метод с указанной вами областью действия.
источник
$('#foobar').ready('click', this.doSomething.call(this));
верно?bind
Метод не работает в старых браузерах, поэтому используйте$.proxy
метод.Просто добавьте к этому, что в ES6 из-за функций стрелок вам не нужно это делать, потому что они фиксируют
this
значение.источник
Я думаю, что это на самом деле зависит от того, что вы собираетесь делать внутри своей
doSomething
функции. Если вы собираетесь получить доступ кMyObject
свойствам, используя это ключевое слово, то вы должны использовать это. Но я думаю, что следующий фрагмент кода также будет работать, если вы не делаете никаких специальных вещей, используяobject(MyObject)
свойства.источник