EDITARcierres de Javascript - ¿Cuál es la diferencia entre estos
Con el número de respuestas que dicen "usted puede hacer cosas particulares!" a continuación, voy a agregar esto a la parte superior también:
Sé que puede emular variables privadas dentro de un cierre. Eso no es lo que estoy preguntando. Estoy preguntando, dados los dos ejemplos a continuación donde estoy "exportando" TODO desde el cierre, ¿cuál es la diferencia fundamental entre estos dos ejemplos?
Teniendo en cuenta estos dos métodos de creación de objetos/métodos:
var test = {}
test = (function(){
var a_method = function(print_me){
return "hello "+print_me;
}
return {print_me: a_method};
})();
test.print_me2 = function(print_me2){
return "hello "+print_me2;
}
test.print_me('world');
>>> returns "hello world"
test.print_me2('world');
>>> returns "hello world"
entiendo que el primer método permite variables privadas (que como desarrollador de Python en el fondo no me importa usar), pero ambos parecen más bien equivalentes para mí, solo el primero parece "más fresco" (como en todos los grandes javascript, la gente parece hacerlo de esa manera) y el segundo parece muy pasado.
Entonces, ¿cuál es la diferencia?
He revisado las preguntas de cierre aquí - la mayoría se centran en qué o por qué las usa; Entiendo su utilidad, solo quiero saber por qué harías la primera sobre el segundo y qué beneficios tiene.
preferiría pruebas contundentes sobre la conjetura - no en busca de un "así es como los niños frescos lo están haciendo" o "he oído que Mozilla hace mejor uso de la memoria cuando se utiliza un cierre", pero la evidencia más cualitativa hacia uno siendo "mejor" que el otro.
es una respuesta mucho mejor que antes. Y sí, entiendo que estoy configurando el objeto para que sea el resultado de la función ejecutada inmediatamente en lugar de establecer una propiedad de dicho objeto; supongamos que estoy tratando de hacer simplemente 'print_me', que será la única propiedad en el objeto de prueba. ¿Cuáles serían los beneficios de hacerlo en un cierre en lugar de hacerlo como una tarea directa? – tkone
@tkone: El beneficio de hacerlo en un cierre es solo que usted tiene el cierre. Puede crear variables locales para no contaminar el espacio de nombres global. Sin embargo, tener cuidado con el espacio de nombres global es más problemático si está escribiendo código de biblioteca o complementos. La gran biblioteca jQuery, por ejemplo, solo agrega dos nombres al espacio de nombres global. – Guffa
ok cool. eso es exactamente lo que estaba tratando de descifrar. Sé que agregar una tonelada de nombres al espacio de nombres global es una mala idea (por lo tanto, usar espacios de nombres), pero solo quería saber si la gente estaba haciendo cierres porque están "calientes" o si sirvieron una utilidad en un caso como el anterior. – tkone