Почему angular. Для каждого контекста?

Я анализировал функцию angular.forEach:

Вот код angular.forEach:

var values = {name: 'misko', gender: 'male'};
var log = [];

angular.forEach(values, function(value, key) {
  this.push(key + ': ' + value);
}, log);

expect(log).toEqual(['name: misko', 'gender: male']);

Описание контекста:

Объект станет контекстом (this) для функции итератора.

У меня возникли вопросы:

Зачем использовать и когда полезно параметр контекст?!

Зачем использовать этот вместо переменной журнала?

Ответ 1

В примере, который вы предоставляете, то же самое можно использовать this или непосредственно log array. Это связано с тем, что callback, используемые в forEach method и log array, определены в одном и том же scope.

Однако могут быть случаи, когда < <22 > определяется внутри другого scope, чем log array. Затем вызов должен выглядеть следующим образом:

angular.forEach(values, getNames, log);

В этом случае мы должны использовать this внутри обратного вызова, поскольку он будет ссылаться на log array, который определен в другом scope.

EDIT:

Смотрите это JSFiddle demo и следующий код, который показывает, что я объяснил.

var getNames = function(value, key) {
  this.push(key + ': ' + value);
};

var processObject = function(){
  var log = []; 
  // Now getNames callback is defined in a different 
  // scope than log
  angular.forEach(values, getNames, log);
  return log;
}

var values = {name: 'misko', gender: 'male'};
var resultArray = processObject(values);
// This gives same result as your exmple
alert(resultArray); 

Ответ 2

Никогда не использовался angular.forEach(), но он выглядит довольно простым.

  var hello = {
      message: 'Ok'
  };

  angular.forEach([' I', ' said', ' hello'], function (value) {
      this.message += value;
  }, hello);

  console.log(hello.message);

1/Он будет записывать "Хорошо, я сказал привет", так что в основном этот параметр "context" позволит вам обновить любой объект, на который вы ссылаетесь. Случай использования очень широк...

2/Я думаю, что это как-то связано с контекстом исполнения. лексической среде, так что это означает, что this должен быть связан с тем, как angular.forEach реализуется. Просто проверьте исходный код angularjs.