3

可能重复:
underscore.js _.each(list, iterator, [context]) 什么是上下文?

所以在 underscore.js 中这个 forEach 函数的上下文中:

// The cornerstone, an `each` implementation, aka `forEach`.
// Handles objects with the built-in `forEach`, arrays, and raw objects.
// Delegates to **ECMAScript 5**'s native `forEach` if available.
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 (i in obj && 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;
      }
    }
  }
};

什么是参数上下文以及如何使用它?

4

1 回答 1

4

设置传递的迭代器函数的this(调用上下文) 。

iterator.call(context, obj[i], i, obj);
      //         ^---right here

JavaScript.call.apply方法允许您调用一个函数,并将this您正在调用的函数的值设置为您提供的第一个参数。

所以如果我...

var obj = {foo:"bar"};
func.call(obj);

... thisinside的值func将是{foo:"bar"}对象。

因此,如果您提供该参数,下划线将.call在调用您传递的函数时将其用作第一个参数,如上所示。

于 2012-08-06T21:52:22.787 回答