Есть ли лучший метод, чем настройка переменной к этому?

StackOverflow https://stackoverflow.com/questions/3571147

Вопрос

В моих объектах 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, чтобы хорошо работать с проблемами на уровне облигаций с этим и закрытыми. Это модель, управляемая событиями, а немного другой способ мышления, но это может стоить изучить по крайней мере.

http://developer.yahoo.com/yui/event/#customevent.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top