Jquery $()。每个方法都隐藏了'this'关键字

时间:2009-06-11 12:32:14

标签: javascript jquery

我正在创建一个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循环中引用包含类?

4 个答案:

答案 0 :(得分:20)

我想你可以这样做:

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

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

答案 1 :(得分:10)

来自http://docs.jquery.com/Core/each

  

这意味着每一次   传入函数被执行(其中   是每一个元素匹配的一次)   'this'关键字指向具体的   DOM元素。请注意,'this'不会   指向jQuery对象。

就个人而言,我更喜欢使用显式参数。这样,它更容易阅读:

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

回答你的问题:JavaScript有动态静态范围。您可以执行以下操作:

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

答案 2 :(得分:4)

你所看到的不是jQuery或其 each() 方法的问题 - 它是有些人认为是JavaScript中的设计错误 - 嵌套函数应该“继承”前一个范围的上下文,因此嵌套函数中的“this”应该等于其父范围中的“this”,除非有意在不同的上下文中调用(使用 apply() call() )。

要解决此问题,您需要在嵌套函数之前将“this”赋给变量,以便您有另一种方法来引用它。

答案 3 :(得分:2)

在jQuery 1.3.3中,您将能够手动设置事件处理程序的上下文等。

jQuery Edge: Bind with a Different “this”

同时,这里的各种技术(别名“this”,使用call / apply)是常见的做法。 Dojo的Peter Higgins也提出了jQuery.hitch plugin,它也有同样的需求。