Ответ 1
Я закончил построение метода forEach и хотел поделиться этой диаграммой со всеми, надеюсь, что это поможет кому-то еще понять его внутреннюю работу.
Мне было интересно, что значение 'this' (или контекст вызова) относится к функции обратного вызова forEach. Этот код не работает:
var jow = [5, 10, 45, 67];
jow.forEach(function(v, i, a){
this[i] = v + 1;
});
alert(jow);
спасибо для объяснения этого мне.
Я закончил построение метода forEach и хотел поделиться этой диаграммой со всеми, надеюсь, что это поможет кому-то еще понять его внутреннюю работу.
Состояние MDN:
array.forEach(callback [, thisArg])
Если параметр thisArg предоставляется для каждого элемента, он будет использоваться как это значение для каждого вызова обратного вызова, как если бы callback.call(thisArg, элемент, индекс, массив). Если thisArg undefined или null, это значение внутри функции зависит от того, является ли функция в строгом режиме или нет (передано значение, если в строгом режиме, глобальный объект если в нестрогом режиме).
Короче говоря, если вы предоставляете только обратный вызов, и вы находитесь в нестрогом режиме (случай, который вы представили), это будет глобальный объект (окно).
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
Если вы не передадите второй параметр в forEach
, this
укажет на глобальный объект. Чтобы достичь того, что вы пытались сделать
var jow = [5, 10, 45, 67];
jow.forEach(function(v, i, a) {
a[i] = v + 1;
});
console.log(jow);
Выход
[ 6, 11, 46, 68 ]
Внутри forEach, this
относится к глобальному объекту window
. Это так, даже если вы вызываете его из другого объекта (т.е. Того, который вы создали)
window.foo = 'window';
var MyObj = function(){
this.foo = 'object';
};
MyObj.prototype.itirate = function () {
var _this = this;
[''].forEach(function(val, index, arr){
console.log('this: ' + this.foo); // logs 'window'
console.log('_this: ' + _this.foo); // logs 'object'
});
};
var newObj = new MyObj();
newObj.itirate();
// this: window
// _this: object