В jQuery, как вы решаете область действия «это», когда вы находитесь в области действия каждого ()? - PullRequest
2 голосов
/ 18 февраля 2010

Я создал объект, и у меня есть метод setup () в объекте.

this.debug = function (){...}

this.setup = function(){    

  var fieldsets = form.children("fieldset");

  fieldsets.each(function(){        
    this.debug($(this).attr("class")));
  });


}

Я пытаюсь вызвать this.debug, который находится в области действия объекта, но не в области действия каждого, поскольку ЭТО отличается от this ...

Как мне получить доступ к this.debug?

Ответы [ 6 ]

5 голосов
/ 18 февраля 2010

Скажите var that = this после this.debug, затем выполните that.debug.

3 голосов
/ 18 февраля 2010

Это в основном ответ Скиллдрика, но он показывает, где он лучше всего работает

this.setup = function(){    
  // save it in a scoped var...  some people use "self" for this purpose, i prefer
  // naming it whatever the outer object actually is...
  var containingObject = this;

  var fieldsets = form.children("fieldset");

  fieldsets.each(function(){        
    // use that scoped var later!
    containingObject.debug($(this).attr("class")));
  });      
}
1 голос
/ 18 февраля 2010

В jQuery 1.4 вы можете сделать:

this.debug = function (){...}

this.setup = function(){    

  var fieldsets = form.children("fieldset");

  fieldsets.each(jQuery.proxy(function(){
    this.debug($(this).attr("class")));
  },this);
}

Функция jQuery.proxy (функция, объект) будет принимать 2 аргумента:

  • Функция будет функцией, используемой в цикле.
  • Аргументом объекта будет this объект внутри функции.

Таким образом, вы можете передать this из внешней области видимости внутри функции each.

0 голосов
/ 18 февраля 2010
this.debug = function (){...}

this.setup = function(){    
  var that = this;
  var fieldsets = form.children("fieldset");

  fieldsets.each(function(){        
    that.debug($(this).attr("class")));
  });


}
0 голосов
/ 18 февраля 2010

Обычно я делаю это так: (примечание: пример ниже из памяти, но выглядит звуком):

function CustomObject()
{
  var _instance = this;

  this.debug = function(){...};
  this.setup =
    function()
    {    
      var fieldsets = form.children("fieldset");
      fieldsets.each(
        function()
        {        
          _instance.debug($(this).attr("class"));
        });
    };
}
0 голосов
/ 18 февраля 2010

Я попробовал это в моей консоли Greasemonkey-Console:

this.debug = function() {
    console.log("foo");
};

this.setup = function() {

    var fieldsets = form.children("fieldset");

    fieldsets.each(function(){
        debug($(this).attr("class"));
    });
};

Который будет искать в области поиска любую отладку ... которая, как мы надеемся, является функцией выше. Это не удастся, если вы назначите переменную с тем же именем:)

...