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

3
可能是重复问题:
underscore.js _.each(list, iterator, [context]) 中的 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是什么,它如何使用?

3
在underscore.js中,_.each(list, iterator, context)中的context是可选的。它允许你设置迭代器(iterator)函数被调用时的上下文(context),也就是this关键字指向的对象。如果不提供context参数,则默认为全局对象(window或global)。 - dan-lee
1个回答

4
设置传递的迭代器函数的调用上下文(this值)。
iterator.call(context, obj[i], i, obj);
      //         ^---right here

JavaScript的.call.apply方法可以让你调用一个函数,并将该函数中的this值设置为你提供的第一个参数。

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

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

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

因此,如果您提供该参数,Underscore 将在调用上述传递的函数时使用它作为 .call 的第一个参数。


我在实践中理解了这一点,但仍然觉得Underscore源代码有些令人困惑。基于代码iterator.call(context, obj[i], i, obj),当没有传递context时会发生什么并不清楚。我是否错过了一个条件,在没有context的情况下将context设置为obj - i_made_that
@i_made_that:不,没有这样的条件。如果未提供“context”,则它将是“undefined”,这意味着函数中“this”的值将是全局对象(如果不在严格模式下),或者如果在严格模式下,则为“undefined”。 - user1106925

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接