underscore.js 如何为函数创建别名?

How does underscore.js create aliases for functions?

例如,_.each 的别名是 _.forEach

我可以调用 [1, 2, 3].forEach(alter),但是当我调用 [1, 2, 3].each(alert) 时,它显示

TypeError: [1, 2, 3].each is not a function

我没有在源代码中找到 forEach 的定义,那么 underscore.js 是怎么做到的?

就此而言,常规 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);
});