Подтвердить что ты не робот

JQuery $(). Каждый метод скрывает ключевое слово 'this'

Я создаю объект Javascript, который содержит функцию, которая выполняет метод jQuery each, как показано ниже:

function MyClass {

  Method1 = function(obj) { 
    // Does something here
  }

  Method2 = function() {
    $(".SomeClass").each(function() {

       // 1          2
       this.Method1(this);

    });
  }

}

К какому объекту относится каждый THIS? jQuery ссылается на элемент, возвращенный из итерации each. Однако я хотел бы, чтобы This[1] ссылался на содержащий класс...

Как я могу ссылаться на содержащий класс из цикла jQuery?

4b9b3361

Ответ 1

Я думаю, вы могли бы сделать что-то вроде этого:

function MyClass {
     Method1 = function(obj) {
         //do something here
     } 

     Method2 = function () {
          var containingClass = this;
          $(".SomeClass").each(function () {
             containingClass.Method1(this);
           });
        }
    }
}

Ответ 2

От http://docs.jquery.com/Core/each:

Это означает, что каждый раз, когда выполняется функция пропускания (которая один раз для каждого элемента, согласованного) 'this' указывает ключевые точки на конкретные Элемент DOM. Обратите внимание, что 'this' не укажите объект jQuery.

Лично я предпочитаю использовать явные параметры. Таким образом, это более легко читается:

$('#rotfl').each(function(index, domObject)
{
   var jQueryObject = $(domObject);
   // code
});

Чтобы ответить на ваш вопрос: JavaScript имеет статическую область dynamic. Вы можете сделать следующее:

var that = this;
$('#rotfl').each(function(index, domObject)
{
   var jQueryObject = $(domObject);
   that.DoSomething();
   // code
});

Ответ 3

То, что вы видите, не является проблемой с jQuery или его методом each() - это то, что некоторые считают ошибкой дизайна в JavaScript - вложенная функция должна "наследовать" контекст предыдущей области действия, поэтому 'this' во вложенной функции должен быть равен 'this' в своей родительской области, если он специально не вызван из другого контекста (используя apply() или call()).

Чтобы обойти это, вам нужно назначить 'this' переменной перед вложенной функцией, чтобы у вас был другой способ ее ссылки.

Ответ 4

В jQuery 1.3.3 вы сможете вручную установить контекст для обработчиков событий и т.д.

jQuery Edge: привязка к другому "this"

Между тем различные методы здесь (сглаживание "this", используя вызов/применение) являются обычной практикой. Питер Хиггинс из Dojo также сделал jQuery.hitch плагин, который удовлетворяет ту же потребность.