Il contesto di chiamata (questo) della chiamata di funzione forEach

Mi stavo chiedendo quale sia il valore “this” (o contesto di invocazione) della funzione di callback forEach. Questo codice non sembra funzionare:

var jow = [5, 10, 45, 67]; jow.forEach(function(v, i, a){ this[i] = v + 1; }); alert(jow); 

Grazie per avermelo spiegato.

MDN afferma:

array.forEach (callback [, thisArg])

Se un parametro thisArg viene fornito a forEach, verrà utilizzato come valore per ciascuna chiamata di callback come se fosse chiamato callback.call (thisArg, element, index, array). Se thisArg non è definito o è nullo, questo valore all’interno della funzione dipende dal fatto che la funzione sia in modalità rigorosa o meno (valore passato se in modalità rigorosa, object globale se in modalità non rigida).

Quindi, in breve, se si fornisce solo la richiamata e si è in modalità non rigida (il caso presentato), sarà l’object globale (finestra).

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

Ho terminato la costruzione del metodo forEach e volevo condividere questo diagramma con tutti, spero che aiuti qualcun altro a cercare di capire il suo funzionamento interno.

Il metodo forEach

Se non si passa il secondo parametro a forEach , this punterà all’object globale. Per ottenere ciò che stavi cercando di fare

 var jow = [5, 10, 45, 67]; jow.forEach(function(v, i, a) { a[i] = v + 1; }); console.log(jow); 

Produzione

 [ 6, 11, 46, 68 ] 

All’interno di forEach, this riferisce all’object della window globale. Questo è il caso anche se lo chiami da un object diverso (cioè uno che hai creato)

 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