Подтвердить что ты не робот

Контекст вызова (этого) вызова функции forEach

Мне было интересно, что значение 'this' (или контекст вызова) относится к функции обратного вызова forEach. Этот код не работает:

var jow = [5, 10, 45, 67];

jow.forEach(function(v, i, a){

    this[i] = v + 1;

});

alert(jow);

спасибо для объяснения этого мне.

4b9b3361

Ответ 1

Я закончил построение метода forEach и хотел поделиться этой диаграммой со всеми, надеюсь, что это поможет кому-то еще понять его внутреннюю работу.

The forEach method

Ответ 2

Состояние 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

Ответ 3

Если вы не передадите второй параметр в 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 ]

Ответ 4

Внутри 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