例如,_.each
的别名为_.forEach
。
我可以致电[1, 2, 3].forEach(alter)
,但是当我致电[1, 2, 3].each(alert)
时,它会说
TypeError:[1,2,3] .each不是函数
我没有在源代码中找到forEach
的定义,那么underscore.js是如何做到的?
答案 0 :(得分:2)
常规forEach
与_.forEach
或_.each
不同。标准[].forEach
是一个本机函数,它是ES5以来Array
API的一部分。 (它在Array
原型上)
如果是_.forEach
,它实际上并不使用[].forEach
方法使其向后兼容(在ES5之前),因此它只使用for
循环。
就别名而言,Underscore通过将多个变量指向同一个东西来创建别名。
您可以在注释来源的section 20中清楚地看到所有这些:
// alias _.each and _.forEach to point to the same function
_.each = _.forEach = function(obj, iteratee, context) {
// ...
if (isArrayLike(obj)) {
// use a for loop to perform the iteration
for (i = 0, length = obj.length; i < length; i++) {
iteratee(obj[i], i, obj);
}
} else {
// ...
以下是下划线正在做的一个简单示例:
var _ = {}; // create our dummy Underscore object
_.each = _.forEach = function(arr, callback) { // alias _.each and _.forEach to loop and do callbacks
for (var i = 0, l = arr.length; i < l; i++) {
callback(arr[i], i);
}
}
var a = ['a', 'b', 'c'];
_.each(a, function(item, index) {
console.log(index + ': ' + item);
});