Есть ли лучший метод, чем настройка переменной к этому?
-
01-10-2019 - |
Вопрос
В моих объектах JavaScript я нашел, что написал это:
this_object = this;
Похоже, это единственный способ пройти переменные элемента к внешним функциям ...
google.maps.event.addListener(this.marker, 'click', function() {
this.info_window.setContent('Chicago marker');
this.info_window.open(this.map,this.marker);
});
Это не работает, я должен скопировать объект в переменную элемента и передавать новый объект (и заменить все this
с участием this_object
)
Это чувствует себя уродливым. Есть ли «лучше» или «уборщик», или этот мой единственный вариант?
Решение
Конечно, есть лучший метод. Это включает в себя создание функции, которая имеет this
контекст уже связан с определенным объектом.
Иметь this
Контекст Обратитесь к текущему объекту, позвоните bind()
Способ функции и передайте необходимый контекст в качестве параметра.
google.maps.event.addListener(this.marker, 'click', function() {
this.info_window.setContent('Chicago marker');
this.info_window.open(this.map,this.marker);
}.bind(this)); // <-- notice we're calling bind() on the function itself
Сейчас это часть стандарта ECMASSCRICT, и если браузер не реализует его в родом, легко сделать это сами.
if (!Function.prototype.bind) {
Function.prototype.bind = function () {
var fn = this,
args = Array.prototype.slice.call(arguments),
object = args.shift();
return function () {
return fn.apply(
object, args.concat(Array.prototype.slice.call(arguments))
);
};
};
}
Увидеть все вопросы и ответы настолько связанный с этим.
Другие советы
Это на самом деле довольно общий рисунок при работе с JavaScript для хранения ссылки на this
в локальной переменную, т.е. var myThing=this;
. Отказ Помните, что функции имеют доступ к локальным переменным, определенным в их объеме. Любые переменные, определенные в содержащих функциях, доступны.
Вы найдете этот кусок кода довольно частого во многих библиотеках и проектах:
function someFunction() {
var that = this;
//....
}
Например, рассмотрим эту функцию:
function container(param) {
function dec() {
if (secret > 0) {
secret -= 1;
return true;
} else {
return false;
}
}
this.member = param;
var secret = 3;
var that = this;
return function () {
if (dec()) {
return that.member + " " + secret;
} else {
return null;
}
};
}
var c = container("foo");
alert( c() ); // "foo 2";
alert( c() ); // "foo 1";
alert( c() ); // "foo 0";
alert( c() ); // null;
Подробнее здесь.
Я видел шаблон до (с подзаимным вопросом (с именем переменной), поэтому я предполагаю, что это действительно обычный шаблон JavaScript, который не просто имеет более чистое решение.
Я не уверен, что это поможет всему сценарию, с которым вы имеете дело, но я нашел пользовательскую утилитую события Yui, чтобы хорошо работать с проблемами на уровне облигаций с этим и закрытыми. Это модель, управляемая событиями, а немного другой способ мышления, но это может стоить изучить по крайней мере.