这两个函数
有什么可能的原因更喜欢其中一个实现而不是另一个?
_.forEach
和 $.each
分别来自于 underscore
和 jQuery
,它们似乎做相同的事情。有什么可能的原因更喜欢其中一个实现而不是另一个?
_.forEach
和 $.each
分别来自于 underscore
和 jQuery
,它们似乎做相同的事情。_.forEach
和 $.each
在传递给回调函数的参数上有所不同。
如果您使用 _.forEach
,传递给回调函数的第一个参数是该值,而非键。
因此,如果您完全不关心键,则应使用 _.forEach
。
其他区别:
_.forEach
更快一些,因为它在现代浏览器中使用原生的 Arrray.prototype.forEach
。this
值也不同。jQuery 的行为不遵循标准,underscore 则遵循。而且 underscore 允许你使用第三个参数来设置 this
值。 - I Hate Lazy它们主要提供了一个替代在IE8中不可用的forEach函数。
如果您正在迭代数组,则它们并不会添加太多东西。
除了回调参数的顺序之外,主要区别在于在jQuery中,该值也可以作为回调调用的上下文而可用(这就是为什么该值较不重要,只有提供第二个参数的原因)。除非您真的想避免向函数传递参数,否则这并不是优选它的主要原因:
var product = 1;
$.each([1, 2, 3], function(){ product *= this });
...
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
...
this
值,但是参数位置颠倒让我有点疯狂。 - I Hate LazyjQuery的样子是这样的:
something.each( function(index, Element) )
Underscore的外观如下:
_.each(list, function(Element, index, list), [context])
// or
_(list).each(function(Element, index, list), [context])
原生数组.forEach 的语法如下:
array.forEach(function(Element, index, list), [context])
所以:
forEach
相同的参数顺序this
设置为Element
,而本地和Underscore允许您提供自己的上下文编辑:为什么能够设置上下文很有用?
考虑一下您有某种对象的情况:
var worker = new FooWorker();
worker.process(something);
worker.process(somethingElse);
假设你想要对数组中的每个值都调用该方法。
通过使用上下文参数,你可以简单地这样说:
myArray.forEach(worker.process, worker);
如果没有它,您需要更冗长的代码(并且每个元素都需要调用一个额外的函数):
// native
myArray.forEach( function(i, e) {worker.process(e);} );
// jquery
$(myArray).each( function() {worker.process(this); } );