Pido disculpas de antemano si esta pregunta es demasiado amplia. De hecho, se trata de 4 preguntas diferentes, pero todas relacionadas con el mismo fragmento de código, y creo que todas giran en torno al mismo principio.Javascript: ¿Qué hace este código?
Decidí hoy, después de usar JS durante años, comenzar a aprender realmente cómo funciona JS en lugar de tratarlo como C que se ejecuta en el navegador. Así que comencé a profundizar en el código jQuery para ver cómo los desarrolladores reales de JS usan el lenguaje. Fue entonces cuando encontré un bloque de código que se parece al código a continuación. Tenga en cuenta que tomé este código de otra publicación apilada aquí In Javascript, can you extend the DOM?. Así que eso no significa que la persona que escribió este código ni siquiera sabía de lo que estaba hablando.
var myDOM = (function(){ // #1
var myDOM = function(elems){ // #2
return new MyDOMConstruct(elems);
},
MyDOMConstruct = function(elems) {
this.collection = elems[1] ? Array.prototype.slice.call(elems) : [elems];
return this; // #3
};
myDOM.fn = MyDOMConstruct.prototype = {
forEach : function(fn) {
var elems = this.collection;
for (var i = 0, l = elems.length; i < l; i++) {
fn(elems[i], i);
}
return this;
},
addStyles : function(styles) {
var elems = this.collection;
for (var i = 0, l = elems.length; i < l; i++) {
for (var prop in styles) {
elems[i].style[prop] = styles[prop];
}
}
return this;
}
};
return myDOM; // #4
})();
1 ¿Por qué declarar la función utilizando var myDOM = (function() {})(); en lugar de var myDOM = function() {};
2 ¿Por qué declarar otra función dentro de la función myDOM con el mismo nombre? ¿Por qué no poner toda la lógica interna del myDOM dentro de la función myDOM externa?
3 ¿Por qué se devuelve explícitamente "this"? Eso habría sido hecho automáticamente, ¿correcto?
4 ¿Qué está pasando aquí? ¿Devuelve el constructor interno de myDOM? Si es así, ¿por qué?
actualización
Así que la mayoría de esto tiene sentido ahora. Con respecto al # 1, pensé que a myDOM se le estaba asignando la función definida después del =, pero no es así. Se le asigna lo que sea que devuelva esa función. Lo cual resulta ser una función.
Todavía no tengo claro el n. ° 3. Sí, entiendo que al usar la función de esta manera
console.log(MyDomConstruct('foo'))
Aparecerá 'indefinido'. Pero no es así como se usa. A pocas líneas arriba es este
return new MyDomConstruct(elems);
me puede entender explícitamente devolver "este" si la declaración fue como esto
return MyDomConstruct(elems);
Pero ese no es el caso.
En realidad 'new MyDomConstruct (elems)' no devuelve 'this' sino una nueva instancia de' MyDomConstruct'. Tal vez en un contexto diferente esto sea más fácil de entender. – nre
Derecha. Pero "this" y una nueva instancia de MyDomConstruct son instancias de MyDomConstruct, ¿no? Además, ¿por qué utilizar la declaración "nueva" si la función va a devolver una instancia de sí mismo? – mellowsoon
Todas buenas respuestas. Le estoy dando la respuesta a jAndy porque él respondió primero, pero +1 para todos los demás. – mellowsoon