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

时间:2015-12-17 04:01:59

标签: javascript arrays underscore.js

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

我可以致电[1, 2, 3].forEach(alter),但是当我致电[1, 2, 3].each(alert)时,它会说

  

TypeError:[1,2,3] .each不是函数

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

1 个答案:

答案 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);
});