Javascript 为什么这两种编写jQuery插件的方法是等价的?

Javascript 为什么这两种编写jQuery插件的方法是等价的?,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,为什么这两种编写jQuery插件的方法是等价的 第一种方式: $.fn.myplugin = function () { return $(this).each(function() { return $(this).bind('click', function () { console.log('Hi'); }); }); }; 第二种方式: $.fn.myplugin = function () { ret

为什么这两种编写jQuery插件的方法是等价的


第一种方式:

$.fn.myplugin = function () {
    return $(this).each(function() {
        return $(this).bind('click', function () {
            console.log('Hi');
        });
    });
};

第二种方式:

$.fn.myplugin = function () {
    return this.bind('click', function () {
        console.log('Hi2');
    });
};

两者之间没有任何区别


只是出于某种原因,在其中一个代码中,您正在执行一个循环,但最终,它们得到了相同的结果。

在您的例子中,除了您在第一个代码段中创建一个新的jQuery对象没有什么好的理由之外,没有什么真正的区别(
这是一个jQuery对象,所以不需要使用
$(this)

一般来说,使用
返回这个是一个好主意,以保持所有内容都是可链接的,并且无论调用插件函数的jQuery对象中有多少元素,代码都能正常工作


返回
this.bind(…)
也可以保持链接性,但对于不仅仅绑定事件的更复杂的插件,每个
循环的可读性通常更高。

它们是等效的,因为在jQuery插件中,
this
是jQuery对象,所以执行
$(this)
没有任何作用

.bind
将对jQuery对象中的所有元素起作用,当您执行
操作时,您将分别对每个元素调用
.bind

因此,它们是等价的,因为它们都在元素上循环并将事件绑定到元素上


我建议使用第二个,它更干净更快。

让我们从一个减少到另一个:

$.fn.myplugin = function () {
    return $(this).each(function() {
        return $(this).bind('click', function () {
            console.log('Hi');
        });
    });
};
当您启动函数时,
是一个jQuery对象,因此
$(此)
不会为您购买任何东西,它很容易变成:

$.fn.myplugin = function () {
    return this.each(function() {
        return $(this).bind('click', function () {
            console.log('Hi');
        });
    });
};
所以您的意思是“对于jQuery对象中的每个元素,创建一个jQuery对象并将一个事件绑定到该对象。”

如果查看
bind
,它将调用
on
,这将执行一些逻辑,最后执行以下操作:

return this.each( function() {
    jQuery.event.add( this, types, fn, data, selector );
});
这意味着它将把事件应用到jQuery对象中的每个元素,因此您实际上是说:

因此,您的意思是“为jQuery对象中的每个元素创建一个jQuery对象,并为该jQuery对象中的每个元素绑定一个事件到该元素。”

现在循环两次,一次在
N
元素列表中,然后在1个元素列表中循环
N
次。实际上,您可以直接绑定所有组件:

$.fn.myplugin = function () {
    return this.bind('click', function () {
        console.log('Hi2');
    });
};

当然,这是最后的代码。

返回
this。每个
this.bind都保持链接完整。您可能想知道,在元素堆栈包含多个匹配元素的情况下,为什么第二种方法有效。在内部,jQuery对所有匹配的元素调用链中规定的任何方法。换句话说,迭代仍然完成,但在内部。提示:使用第二个。@minitech:为什么?一个真正的插件很可能不仅仅是绑定一个事件。然后,对于集合中的每个元素,最好有一个单独的作用域。但是,在这种情况下,你是对的。@ThiefMaster:好了-这种情况:)结果可能没有差别,但两者并不相等。