在深入研究下划线库的源代码时,我发现_.each
只要有可用就依赖于ECMAScript 5 API 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(静态的,而不是jQuery包装器的.each方法)只执行调用回调函数的传统for
,无论{{1}是否可用。有没有理由我错过了?
答案 0 :(得分:1)
这可能是因为两者在实现上有所不同 - Array.forEach将数组元素作为第一个参数传递,将索引作为第二个参数传递。 jQuery.each首先传递索引,数组元素发送。
实际上,关于堆栈溢出的最佳讨论源可能就在这里:
jQuery.each implementation differs from native Array.forEach
他们的猜测是这是一个错误 - 很多网站已经实现了jQuery.each,期望索引优先,他们无法切换它们。