Почему 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.