How does jQuerys $.each() work?
也许标题不好,但这是我的问题:
我正在构建一个框架来了解有关 javascript 的更多信息。我想使用"jQuery"风格。
如何创建一个
1 2 | $("p").fadeOut(); //() is there $.each(arr, function(k, v) {...}); //Dropped the (), but HOW? |
这是我想出的,但它不起作用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $2DC = function(selector) { return new function() { return { circle : function() { //... } } } } $2DC("#id1"); //Work $2DC("#id2").circle(); //Work $2DC.circle(); //DONT WORK |
但请记住,在 JavaScript 中,您可以将"东西"直接附加到函数中。
1 2 3 4 5 6 | function foo(){ } foo.blah ="hi"; foo.func = function() { alert("hi"); }; foo.func(); //alerts"hi" |
这就是(概念上)jQuery 的
1 | jQuery.each = function(someArr, callback) { ... |
所以现在
1 2 | jQuery.each([1, 2, 3], function(i, val) { }); |
或更熟悉的
1 2 | $.each([1, 2, 3], function(i, val) { }); |
所以对于你的特殊情况,支持:
1 | $2DC.circle(); |
您必须将
1 2 3 | $2DC.circle = function(){ // code }; |
函数是 JavaScript 中的对象。因此,它们可以用作变量,就像整数、字符串等一样。
在您的示例中,
在
1 2 | $2DC.circle = function(){ } |
现在,
1 | $2DC.circle(); //DONT WORK |
这不起作用,因为 $2DC 没有任何名称为
其中
如果你定义
1 2 3 | $2DC.circle = function(){ }; |
你可以使用
可以使用类似这样的方法来实现。
1 2 3 4 5 | $.fn.each = function (otherparams); $.each = function (collection, otherparams) { return $.fn.each.apply(collection, arguments.slice(1)); }; |
将 each 添加为 fn 的属性(它只是 jQuery.prototype 的别名)意味着它可以作为每个 jQuery 集合的方法使用。第二段代码意味着它可以作为参数传入集合中。
应用(和调用)是 javascript 的一些最有用的特性,一旦你习惯了它们。
创建你的基础函数,然后给函数添加方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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; |
你所指的
jQuery 中的
调用
上定义的方法和插件
试试这样:
1 2 3 4 5 6 7 8 9 10 11 | $2DC = (function(selector) { return new function() { return { circle : function() { //... } } } })(); |
这样,$2DC 是函数返回的对象,而不是函数本身。