Javascript 未指定闭包变量

Javascript 未指定闭包变量,javascript,closures,Javascript,Closures,简单地说,我有以下几点: jQuery.fn.X = function(){ var elements = jQuery(this); elements.click(function(){ var self = jQuery(this); //elements here is not defined why? }); 为什么不在单击函数中定义元素,而将其作为闭包变量?这是创建jQuery插件的正确方法 jQuery.fn.X = func

简单地说,我有以下几点:

jQuery.fn.X = function(){
    var elements = jQuery(this);
    elements.click(function(){
        var self = jQuery(this);
        //elements here is not defined why?
    });

为什么不在单击函数中定义
元素
,而将其作为闭包变量?

这是创建jQuery插件的正确方法

jQuery.fn.X = function () {
    // here, "this" will be a jQuery object containing all elements you matched
    // with X(). You must return that object.
    return this.click(function () {
        // here, "this" will be a DOM element. You don't have to return it.
        var self = jQuery(this);
        // ...
    });
});

必须返回jQuery才能保持方法链接正常工作。

这是创建jQuery插件的正确方法

jQuery.fn.X = function () {
    // here, "this" will be a jQuery object containing all elements you matched
    // with X(). You must return that object.
    return this.click(function () {
        // here, "this" will be a DOM element. You don't have to return it.
        var self = jQuery(this);
        // ...
    });
});


您必须返回jQuery以保持方法链接工作。

除非在单击处理程序出现之前重新分配了
元素
,否则它不会在那里“未定义”(
未定义
?)-是的,变量绑定在闭包中。代码不是上下文不完整,就是观察到的症状不正确。@Hogan:他可能不想使用
这个
。因为,它将指向
元素
中的一个
元素
,不创造一个终结?你是什么意思@Hogan@Hilmi-原型的元素被复制到新对象中,因此它们没有闭包--它们有一个空闭包--这就是为什么在函数调用时没有定义元素--它是从“其他地方”调用的没有相同的闭包。除非在单击处理程序出现之前重新分配了
元素
,否则它不会在那里“未定义”(
未定义
?)——是的,变量绑定在闭包中。代码不是上下文不完整,就是观察到的症状不正确。@Hogan:他可能不想使用
这个
。因为,它将指向
元素
中的一个
元素
,不创造一个终结?你是什么意思@Hogan@Hilmi-原型的元素被复制到一个新对象中,因此它们没有闭包--它们有一个空闭包--这就是为什么在函数调用中没有定义元素--它是从没有相同闭包的“其他地方”调用的。您忘记了每个元素。jquery chaineable应该处理所有匹配elements@RoyiNamir不,我没有。您不必使用
each()
click()
也将处理所有匹配的元素,就像几乎所有其他jQuery API函数一样。我会做
$.fn.plugin_name=function(){返回这个.each(function(){});}
@Tomalak是真的,但我没有看到很多情况下插件只是调用jQuery方法,就是这样…@RoyiNamir
each()
返回它所操作的完全相同的jQuery对象,所以是的,它“返回自己”。(
($x=$($a”);$y=$x.each(function(){/*…*/});alert($x===$y);
将提醒
true
)您忘记了每一项。jquery Chaineable应处理所有匹配elements@RoyiNamir不,我没有。您不必使用
each()
单击()
也将处理所有匹配的元素,就像几乎所有其他jQuery API函数一样。好吧。我会做
$.fn.plugin_name=function(){返回这个。each(function(){};};
@Tomalak True,但我没有看到很多情况下插件只调用jQuery方法,就是这样…@RoyiNamir
each()
返回与它操作的jQuery对象完全相同的对象,因此是的,它“返回自身”。(
($x=$($a”);$y=$x.each(function(){/*…*/});alert($x===$y);
将发出警报
true