2013-02-22 52 views
6

尽管挖掘到下划线库的源代码,我发现在该_.each依赖于ECMAScript的5 API Array.forEach可用时:是否有理由为什么jQuery.each不依赖Array.forEach时可用?

var each = _.each = _.forEach = function(obj, iterator, context) { 
    if (obj == null) return; 
    if (nativeForEach && obj.forEach === nativeForEach) { 
     obj.forEach(iterator, context); 
    } else if (obj.length === +obj.length) { 
     for (var i = 0, l = obj.length; i < l; i++) { 
      if (iterator.call(context, obj[i], i, obj) === breaker) { 
       return; 
      } 
     } 
    } else { 
     for (var key in obj) { 
      if (_.has(obj, key)) { 
       if (iterator.call(context, obj[key], key, obj) === breaker) { 
        return; 
       } 
      } 
     } 
    } 
}; 

我注意到jQuery.each(静态的,而不是a的.each方法jQuery wrapper)只是调用回调函数的传统for,不管forEach是否可用。我错过了那个原因吗?

+2

jQuery是一个对象,而不是一个数组。你将不得不在数组和类nodeList对象之间来回转换,以便能够链接jQuery调用以使用Array方法。 – kennebec 2013-02-22 04:57:18

+0

@kennebec我在说$ .each(),而不是.each()。我编辑了这个问题,使之更加清晰。 – 2013-02-22 05:18:10

+0

一个可能的解释是jQuery的'.each()'与'.forEach'没有完全相同的接口,所以两者不能互换。如果jQuery首先实现了它们的实现,那么他们将不得不中断/更改其API,以便在出现时使用.forEach。 – jfriend00 2013-02-22 05:19:30

回答

1

这可能是因为两者在实现方面不同 - Array.forEach传递数组元素作为第一个参数,而索引作为第二个参数。 jQuery.each首先传递索引,数组元素send。

实际上可能是最好的讨论来源就在这里堆栈溢出:

jQuery.each implementation differs from native Array.forEach

他们的猜测是,这是一个错误 - 这么多的网站已经实现jQuery.each,第一期待指数,即他们不可能扭转它们。

相关问题