Есть ли лучший способ, чем установка переменной для этого? - PullRequest
8 голосов
/ 26 августа 2010

В моих объектах 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)

Это ужасно. Есть ли способ «лучше» или «чище», или это мой единственный вариант?

Ответы [ 5 ]

5 голосов
/ 26 августа 2010

Конечно, есть лучший метод.Он включает создание функции, контекст которой 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

Теперь это часть стандарта ECMAScript, и если браузер не реализует его изначально, это легко сделать самостоятельно.

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))
            );
        };
    };
}

Просмотреть все вопросыи ответы на SO, связанные с этим.

4 голосов
/ 26 августа 2010

На самом деле, при работе с JavaScript это довольно распространенный способ хранить ссылку this в локальной переменной, т.е. var myThing=this;.Помните, что функции имеют доступ к локальным переменным, определенным в их области видимости.Любые переменные, определенные в содержащих функциях, доступны.

1 голос
/ 26 августа 2010

Вы найдете этот фрагмент кода довольно часто во многих библиотеках и проектах:

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;

Подробнее здесь.

0 голосов
/ 26 августа 2010

Я не уверен, что это поможет любому сценарию, с которым вы имеете дело, но я обнаружил, что пользовательская утилита событий YUI прекрасно работает для решения проблем с этим и замыканий.Это модель, основанная на событиях, и немного другое мышление, но, возможно, стоит хотя бы изучить ее.

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

0 голосов
/ 26 августа 2010

Я видел шаблон ранее (с вызываемой рассматриваемой переменной), поэтому я предполагаю, что это действительно обычный шаблон javascript, который не просто имеет более чистое решение.

...