jQuerys $ .each()如何工作?

时间:2012-01-25 17:10:42

标签: javascript jquery frameworks

也许是一个糟糕的头衔,但这是我的问题: 我正在构建一个框架来了解有关javascript的更多信息。我想用“”jQuery“”风格。

如何在()可选的情况下创建功能?

$("p").fadeOut(); //() is there
$.each(arr, function(k, v) {...}); //Dropped the (), but HOW?

这是我提出的,但它不起作用:

$2DC = function(selector)
{
    return new function() {
        return {
            circle : function()
            {
                //...
            }
        }
    }
}


$2DC("#id1"); //Work
$2DC("#id2").circle(); //Work
$2DC.circle(); //DONT WORK

7 个答案:

答案 0 :(得分:23)

$实际上只是jQuery函数的别名。您可以使用以下命令调用该函数:

jQuery("p");$("p");

但请记住,在JavaScript中,您可以将“stuff”直接附加到函数中。

function foo(){
}
foo.blah = "hi";
foo.func = function() { alert("hi"); };

foo.func(); //alerts "hi"

这是(概念上)jQuery的each函数的定义方式。

jQuery.each = function(someArr, callback) { ...

所以现在jQuery.each是一个可以这样调用的函数:

jQuery.each([1, 2, 3], function(i, val) {
});

或更熟悉的

$.each([1, 2, 3], function(i, val) {
});

因此,对于您的特定情况,请支持:

$2DC.circle(); 

您必须将circle功能直接添加到$2DC

$2DC.circle = function(){
   // code
};

答案 1 :(得分:6)

函数是JavaScript中的对象。因此,它们可以用作变量,就像整数,字符串等一样。

在您的示例中,$2DC是一个返回包含circle函数的对象的函数。

$2DC.circle();不起作用,因为circle只是返回对象的属性,而不是$2DC本身的属性。

对于$.each,这适用于$包含each属性。您的$2DC也可以这样做。像这样:

$2DC.circle = function(){
}

现在,$2DC.circle();将有效。因此,正如您所看到的那样,函数是对象,因此可以像其他对象一样具有属性。

答案 2 :(得分:1)

$2DC.circle(); //DONT WORK

这不起作用,因为$ 2DC没有名称为circle的任何函数。这只是一个功能。

$2DC("#id2")返回包含具有circle函数的对象的新函数,因此$2DC("#id2").circle();可以正常使用。

如果你定义

$2DC.circle = function(){

};

您可以使用$2DC.circle();

答案 3 :(得分:0)

您引用的$.each方法是$函数对象上的属性。

jQuery中的$对象是一个函数对象,与JavaScript中的任何对象一样,您可以在对象上分配属性。

调用$函数对象充当构造函数,并返回由jQuery.fn.init()函数创建的新对象实例。 jQuery的原型被复制到jQuery.fn.init,以便新创建的对象实例可以访问jQuery上定义的方法和插件。

答案 4 :(得分:0)

创建基本函数,然后向函数添加方法。

var f = function(text){
    alert(text);
}
f.fn1 = function(text){
    alert('fn:'+text);
}
f.fn2 = function(text){
    alert('fn2:'+text);
}

f('hi'); //hi;
f.fn1('hi'); //fn:hi;
f.fn2('hi'); //fn2:hi;

答案 5 :(得分:0)

可以使用类似的东西来实现。

$.fn.each = function (otherparams);

$.each = function (collection, otherparams) {
  return $.fn.each.apply(collection, arguments.slice(1));
};

将每个作为fn的属性(它只是jQuery.prototype的别名)添加意味着它可用作每个jQuery集合的方法。代码的第二位意味着它可以作为参数在集合中传递。

一旦你习惯了它,

apply(和call)是javascript最有用的功能。

答案 6 :(得分:-1)

试试这样:

$2DC = (function(selector)
{
    return new function() {
        return {
            circle : function()
            {
                //...
            }
        }
    }
})();

这样$ 2DC是函数返回的对象,而不是函数本身。