我正在创建一个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循环中引用包含类?
答案 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,它也有同样的需求。