Estoy tratando de entender uno de los ejemplos en MDN para Function.prototype.call() , "Uso de call() para invocar una función anónima" :
const animals = [ { species: 'Lion', name: 'King' }, { species: 'Whale', name: 'Fail' } ]; for (let i = 0; i < animals.length; i++) { (function(i) { this.print = function() { console.log('#' + i + ' ' + this.species + ': ' + this.name); } this.print(); }).call(animals[i], i); } ¿Es la i en la línea #7 (function(i) { una repetición/opcional?
Me pareció que }).call(animals[i], i); en la línea # 12 con el segundo parámetro ya está pasando i , así que para hacer mi prueba, quería eliminarlo
Quiero decir que en la línea #7, en lugar de (function(i) { he probado (function() { y como suponía, da el mismo resultado.
Gracias también a Jonsharpe, me aclaré el mecanismo.
Como esta era una pregunta didáctica, comparto la explicación para estudiantes como yo.
en primer lugar, el código es engañoso, por lo que para comprenderlo mejor, como sugiere Jonsharpe, es mejor reemplazar 'i' con 'index'
const animals = [ { species: 'Lion', name: 'King' }, { species: 'Whale', name: 'Fail' } ]; for (let i = 0; i < animals.length; i++) { (function(index) { this.print = function() { console.log('#' + index + ' ' + this.species + ': ' + this.name); } this.print(); }).call(animals[i], i); }como debe leerse, con paráfrasis sí significa
.call la function(index) pasándola (animals[i], i) como parámetros
el primer parámetro, un objeto, está disponible a través de this. el segundo se pasa a través del index
En la línea #8 se agrega y define un método 'imprimir' al objeto
En la línea #11 este nuevo método se ejecuta/llama this.print();
El proceso se repite animals.length veces