2010-05-18 47 views
1

在原型的繁锁:jQuery的范围实用

for (i=0; i<10; i++) { ... } 

可以写成

$R(0, 10).each(function(i){ ... }); 

有范围在JQuery中的相同呢?

+5

有趣的 “累赘” 第一个例子是如何比第二个例子个字符。它也会跑得更快。 – 2010-05-18 10:15:28

+1

不可否认,第一个例子确实存在将循环变量'i'放入当前范围(或者全局范围,如果在此范围的其他地方没有'var i')的缺点。 – 2010-05-18 15:57:16

+0

也许不是在上面的例子中,因为它处理的数字不是索引,但是当迭代集合时,所有那些我在'var i = 0;我 Anurag 2010-05-19 02:24:25

回答

3

http://code.google.com/p/jquery-utils/source/browse/trunk/src/jquery.arrayUtils.js?r=452

jQuery的不提供范围扩大本身,但它是一个简单的加法。它只有两个部分。首先,范围函数应该返回一个数组,范围中的每个项目都扩展为一个数组值。接下来,将方法添加到Array以迭代处理函数中传递的每个对象。

这里我们定义了forEach,它是用于遍历数组的ECMA-262标准的一部分。有关更多详细信息,请参见MDC

if (!Array.prototype.forEach) { 
    Array.prototype.forEach = function(fun /*, thisp*/) { 
    var len = this.length >>> 0; 
    if (typeof fun != "function") 
     throw new TypeError(); 

    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) { 
     if (i in this) 
     fun.call(thisp, this[i], i, this); 
    } 
    }; 
} 

接下来,我们需要一个函数将范围扩展到jQuery名称空间内的数组。从上面的网址采取的措施(原始来源 - http://blog.outofhanwell.com/2006/03/29/javascript-range-function/) :

$.extend({ 
    // Returns a range object 
    // Author: Matthias Miller 
    // Site: http://blog.outofhanwell.com/2006/03/29/javascript-range-function/ 
    range: function() { 
     if (!arguments.length) { return []; } 
     var min, max, step; 
     if (arguments.length == 1) { 
      min = 0; 
      max = arguments[0]-1; 
      step = 1; 
     } 
     else { 
      // default step to 1 if it's zero or undefined 
      min = arguments[0]; 
      max = arguments[1]-1; 
      step = arguments[2] || 1; 
     } 
     // convert negative steps to positive and reverse min/max 
     if (step < 0 && min >= max) { 
      step *= -1; 
      var tmp = min; 
      min = max; 
      max = tmp; 
      min += ((max-min) % step); 
     } 
     var a = []; 
     for (var i = min; i <= max; i += step) { a.push(i); } 
     return a; 
    } 
}); 

Alrighty,现在我们可以这样做:

$.range(2, 10).forEach(function(v) { 
    console.log(v); // 2, 3, 4, .., 9 
}); 

或者用自定义步长值,而不是1

$.range(2, 20, 4).forEach(function(v) { 
    console.log(v); // 2, 6, 10, 14, 18 
}); 
使用
1

我更喜欢一个数组的生成器 - 更优雅(imho)和更高的内存效率。

function Range(low, high){ 
    this.low = low; 
    this.high = high; 
} 
Range.prototype.__iterator__ = function(){ 
    for (var i = this.low; i <= this.high; i++) 
    yield i; 
}; 

那么你可以简单

var range = new Range(3, 5); 
for (var i in range) 
    print(i); // prints 3, then 4, then 5 in sequence 

来源:https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Iterators_and_Generators