对象方法中的“this”与事件处理程序中的“this”

时间:2013-04-17 20:25:28

标签: javascript jquery jquery-plugins

修改
答案指出,关键字this在jQuery中使用,就像在任何JavaScript代码中一样。也就是说,对象方法将对象本身作为this接收,这就是$.fn函数所发生的事情(它们在jQuery对象上调用)。事件处理函数是回调函数,它们不是对象方法,调用者决定函数内部this将引用什么。它通常引用DOM元素。

原始问题

this$(this)之间的差异通常被解释为this引用了 DOM对象,而$(this)引用了 jQuery object (一个带有jQuery包装器的DOM元素) 在下面的示例中,处理函数作为DOM元素传递this,并通过将其包装在$()中,我们从中创建一个jQuery对象,因此我们可以使用它上面的函数{ {1}}命名空间。

$.fn


但是,我刚刚在learn.jquery.com上看到了这个解释:

Plugins | jQuery learning center

$('div').on('click', function(event){
    event.preventDefault();
    $(this).css('backgroundColor', 'red');
});


这是否意味着$.fn.greenify = function() { this.css( "color", "green" ); }; $("a").greenify(); // makes all the links green // Explanation provided by the author of the article: // "Notice that to use css(), another method, we use this, not $( this ). // This is because our greenify function is a part of the same object as css()." 在传递给事件处理函数时引用了DOM对象,但在传递给jQuery对象方法时引用了jQuery对象?
事实上,它是有道理的,因为该方法是在jQuery对象上调用的,因此将它传递给jQuery对象是合乎逻辑的。

4 个答案:

答案 0 :(得分:7)

“this”标识符与jQuery无关,它是javascript的组成部分。

您可以查看此链接,其中提供了“this”关键字的详细说明:http://www.devign.me/javascript-this-keyword/

答案 1 :(得分:5)

在jQuery插件中,方法this已经是jQuery对象。因此,您可以直接在this上使用jQuery方法。

这与事件处理程序无关。这是因为当在对象(在这种情况下是jQuery对象)上调用方法时,javascript将this设置为指向该对象。所以,由于这种情况下的对象是一个jQuery对象,那就是this

事件处理程序回调函数不是方法调用,因此它的工作方式不同 - 它是一个回调,回调的调用者决定使用this.call()设置.apply()的内容。对于大多数事件处理程序回调,代码专门决定将this设置为触发事件的DOM对象。

答案 2 :(得分:2)

那是因为在你的greenify插件中,没有涉及回调,没有事件处理程序。

调用
$("a").greenify();

这意味着,当您执行this时,函数内部的$("a")this的接收者,就像b一样a.b();a

答案 3 :(得分:1)

.greenify被调用为jQuery实例上的方法。如果你查看jQuery源代码,你会发现

jQuery.fn = jQuery.prototype = {
  // All the goodies...

表明您的理解是正确的。