Наличие вопроса закрытия.Не могу решить это.пожалуйста, порекомендуйте - PullRequest
0 голосов
/ 24 марта 2012

У меня есть этот код:

  _trackit: function(){
  for(var key in this.items.sublinks){
     switch(key){
         case 'shoes':
            for(var innerkey in this.items.sublinks[key]){
                (function(){
                  $(innerkey).observe('click', (function(e){
                    Event.stop(e);
                    someClass.click_link( this.items.sublinks[key][innerkey],false)
                   }));
                 )(this);
            }  
         break;
     }
  }
 }

Размер хэша, который я передаю, имеет размер 2. Но, как вы можете догадаться, обе ссылки (поскольку хеш-код отображается на ссылки), передаютпоследнее значение хеша (someClass.click_link <- здесь это значение, <code>this.item.sublinks[key][innerkey]).

Я пытался использовать внутреннюю функцию и т.д. ... но что-то не так.Если я перейду к «внутренней функции глубоко», то this.items вернет undefined.

Любая помощь?

Ответы [ 3 ]

2 голосов
/ 24 марта 2012

Поскольку вы передаете this в качестве аргумента, вам просто нужно создать для него параметр - назовите его, скажем, _this - и тогда вы можете ссылаться на _this вместо this внутрифункция:

                (function(_this, innerkey){
                  $(innerkey).observe('click', (function(e){
                    Event.stop(e);
                    someClass.click_link( _this.items.sublinks[key][innerkey],false)
                   }));
                 )(this, innerkey);

(Есть и другие способы, но, похоже, вышеизложенный способ, к которому вы стремились, когда передавали this в качестве аргумента? И это вполне респектабельный способсделайте это.)

Отредактировано, чтобы добавить: В соответствии с комментарием Роба В., я отредактировал вышеупомянутое, чтобы добавить innerkey в качестве параметра, так как в противном случае внутреннее выражение function(e){...}будет ссылаться на ту же innerkey переменную , что и на внешнюю функцию - переменную, которая, как переменная цикла, вероятно, изменится к тому времени, когда внутренняя функция на самом деле выполняется.Передача его в качестве параметра дает внутреннему выражению новую переменную innerkey, которая равна тому, что innerkey было при создании внутренней функции.

1 голос
/ 24 марта 2012

Как уже упоминалось, вам нужно иметь аргумент, чтобы получить «это», которое вы передаете.Вам также нужно будет передать копии переменных «key» и «innerkey», чтобы избежать ошибок замыканий внутри цикла.

var make_event_listener = function(that, key, innerKey){
    return function(e){
        Event.stop(e);
        someClass.click_link( that.items.sublinks[key][innerkey], false)
    };
};

//...
for(var innerkey in this.items.sublinks[key]){
   $(innerkey).observe('click', make_event_listener(this, key, innerKey) );
}
//...

Конечно, вместо этого вы можете использовать анонимную версию make_event_listenerно я нахожу этот способ более читабельным.

1 голос
/ 24 марта 2012

Второй вызов «this» ссылается на фактический элемент, по которому щелкают.Измените его на:

_trackit: function () {
    var self = this;
    for (var key in this.items.sublinks) {
        switch (key) {
        case 'shoes':
            for (var innerkey in this.items.sublinks[key]) {
                (function () {
                    $(innerkey).observe('click', (function (e) {
                        Event.stop(e);
                        someClass.click_link(self.items.sublinks[key][innerkey], false)
                    }));)(this);
                }
                break;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...