(function($)
{
$.vari = "$.vari";
$.fn.vari = "$.fn.vari";
// $.fn is the object we add our custom functions to
$.fn.DoSomethingLocal = function()
{
return this.each(function()
{
alert(this.vari); // would output `undefined`
alert($(this).vari); // would output `$.fn.vari`
});
};
})(jQuery);
// $ is the main jQuery object, we can attach a global function to it
$.DoSomethingGlobal = function()
{
alert("Do Something Globally, where `this.vari` = " + this.vari);
};
$(document).ready(function()
{
$("div").DoSomethingLocal();
$.DoSomethingGlobal();
});
我很困惑为什么在$.fn.DoSomethingLocal
函数中,$(this).vari
是字符串“$ .fn.vari”而不是“$ .vari”。我认为this
调用中的each
引用提供了一个dom对象,因此调用$(this)
会返回一个标准的jquery对象,其原型为$
,而不是$.fn
。
这是怎么发生的?
答案 0 :(得分:3)
jQuery.fn
命名空间由jQuery对象继承。因此,如果您撰写$.fn.somewhat
,现在可以通过$().somewhat
访问此内容。这就是为什么任何jQuery插件都必须扩展jQuery.fn
对象/命名空间。
模式jQuery.somewhat
只会使用somewhat
扩展普通对象。这与window.somewhat
或anyobject.somewhat
一样好。
$.fn
具有原型继承,这就是魔法。
return this.each(function()
{
alert(this.vari); // would output `undefined`
alert($(this).vari); // would output `$.fn.vari`
});
在此上下文中,this
始终引用调用对象,即jQuery object
。由于所有jQuery对象都继承自jQuery.fn
,因此您将获得$.fn.vari
。
注意强>
在$.fn
范围内,this
引用 jQuery对象!
在.each()
范围内,this
引用 DOM节点!
为什么?
Javascript的.apply()
函数允许您指定要执行函数的上下文。 “Resig& the boys”使用该原则来“derefer”this
。
答案 1 :(得分:0)
当使用.each()迭代jquery对象时,这将引用未包装在jquery对象中的元素。方法jQuery.vari()在jquery对象上,而不是元素,所以你必须先将元素包装在jquery对象中,然后才能调用$ .vari()方法。