El context de invocación (this) de la llamada a la function forEach

Me preguntaba cuál es el valor 'this' (o context de invocación) de la function de callback forEach. Este código no parece funcionar:

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

Gracias por explicármelo.

4 Solutions collect form web for “El context de invocación (this) de la llamada a la function forEach”

MDN dice:

array.forEach (callback [, thisArg])

Si se proporciona un parámetro thisArg a forEach, se utilizará como este valor para cada invocación de callback como si se llamara callback.call (thisArg, element, index, array). Si thisArg no está definido o es nulo, este valor dentro de la function depende de si la function está en modo estricto o no (valor pasado si está en modo estricto, object global si está en modo no estricto).

En resumen, si solo proporciona la callback y está en modo no estricto (el caso que presentó), será el object global (window).

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

Terminé la construcción del método forEach y quería compartir este diagtwig con todos, espero que ayude a alguien más a tratar de entender su funcionamiento interno.

El método forEach

Si no pasa el segundo parámetro a forEach , this apuntará al object global. Para lograr lo que estabas tratando de hacer

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

Salida

 [ 6, 11, 46, 68 ] 

Dentro de cada uno, this refiere al object window global. Este es el caso incluso si lo llamas desde un object diferente (es decir, uno que has creado)

 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 
Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.