context参数在underscore.js中的作用是什么?

时间:2012-08-06 21:47:32

标签: javascript underscore.js

  

可能重复:
  underscore.js _.each(list, iterator, [context]) what is 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;
      }
    }
  }
};

参数 context 是什么以及它是如何使用的?

1 个答案:

答案 0 :(得分:4)

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

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

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

所以,如果我这样做......

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

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

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