Как объяснено в других ответах, context
- это контекст this
, который будет использоваться внутри обратного вызова, переданного each
.
Я объясню это с помощью исходного кода соответствующих методов из исходный код подчеркивания
Определение _.each
или _.forEach
выглядит следующим образом:
_.each = _.forEach = function(obj, iteratee, context) {
iteratee = optimizeCb(iteratee, context);
var i, length;
if (isArrayLike(obj)) {
for (i = 0, length = obj.length; i < length; i++) {
iteratee(obj[i], i, obj);
}
} else {
var keys = _.keys(obj);
for (i = 0, length = keys.length; i < length; i++) {
iteratee(obj[keys[i]], keys[i], obj);
}
}
return obj;
};
Здесь важно отметить второе утверждение
iteratee = optimizeCb(iteratee, context);
Здесь context
передается другому методу optimizeCb
, и возвращаемая функция затем присваивается iteratee
, который вызывается позже.
var optimizeCb = function(func, context, argCount) {
if (context === void 0) return func;
switch (argCount == null ? 3 : argCount) {
case 1:
return function(value) {
return func.call(context, value);
};
case 2:
return function(value, other) {
return func.call(context, value, other);
};
case 3:
return function(value, index, collection) {
return func.call(context, value, index, collection);
};
case 4:
return function(accumulator, value, index, collection) {
return func.call(context, accumulator, value, index, collection);
};
}
return function() {
return func.apply(context, arguments);
};
};
Как видно изПриведенное выше определение метода optimizeCb
, если context
не передано, то func
возвращается как есть.Если передано context
, функция обратного вызова вызывается как
func.call(context, other_parameters);
^^^^^^^
func
, вызывается с call()
, который используется для вызова метода путем установки контекста this
Это.Таким образом, когда this
используется внутри func
, это будет означать context
.
// Without `context`
_.each([1], function() {
console.log(this instanceof Window);
});
// With `context` as `arr`
var arr = [1, 2, 3];
_.each([1], function() {
console.log(this);
}, arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
Вы можете считать context
последним необязательным параметром для forEach
в JavaScript.