Bueno, antes de nada perdona si no contesto a las preguntas todavía. Primero, unas ideas generales.
En primer lugar, en Javascript las funciones
son objetos, de modo que la diferencia en cuanto a la declaración, creación, vida y destrucción de funciones y objetos, es... bueno, poca. La diferencia, en realidad está más en cómo los manejes.
Javascript tiene recolección de basura y funciona, en este sentido, como cualquier otro lenguaje. Cualquier objeto (léase objeto o función), desde su creación permanece en memoria hasta que es destruído. Cuando no existen más referencias a ese objeto (recuerda las funciones también son objetos), entonces se marca para ser eliminado y luego se elimina.
Para un manejo normal de funciones y objetos (es decir, si no entramos a buscar -por ahora- mejores formas de controlar qué funciones u objetos se cargan), en el declaramos ambos de la forma habitual, la diferencia va a ser nula. Ambos se cargarán en memoria y estarán disponibles.
La diferencia más importante, de hecho, va a ser una de organización. Si todo el mundo declara sus funciones en el namespace global, es mucho más caótico todo y es más probable que ocurra alguna colisión de nombres. Es decir, si tú en tu librería declaras la función truncate() y yo en la mía declaro otra función truncate(), ambas librerías no podrán ser utilizadas a la vez así como así. Sin embargo, si tú declaras todas las funciones de tu librería dentro de un objeto KQuery y yo las declaro dentro de un objeto VQuery entonces nuestras funciones no entran en conflicto porque se llaman KQuery.truncate() y VQuery.truncate().
¿Cuándo se cargan las cosas en memoria? Básicamente cuando se parsean. Es decir, cuando cargas un fichero.js se lee, y parsea su contenido. Si se lee la declaración de una función o de un objeto (es lo mismo, luego lo vemos), entonces se crea ese objeto o función.
Ahora bien, volviendo a tu código y a tus preguntas, el primer problema está en el código que pones, que no sé si realmente hace lo que quieres decir o si, dicho de otro modo, es equivalente. Veamos los siguientes trozos de código y lo que hace cada uno:
Código javascript
:
Ver original// código A:
function f1() { ... }
// código B:
var f2 = function() { ... }
// código C:
var o1 = {
f1: function() { ... },
f2: function() { ... }
}
// código D1:
var g1 = function() {
this.f1 = function() { ... };
this.f2 = function() { ... };
return this;
}
// código D2:
var o2 = new g1();
// código E:
var o3 = (function() {
this.f1 = function() { ... };
this.f2 = function() { ... };
return this;
})();
Bien, A y B hacen exactamente lo mismo. Crean la función declarada literalmente y la asignan a la variable f1 o f2. C es interesante porque es básicamente lo mismo. Crea el objeto declarado con el literal y lo asigna a o1.
Cualquiera de esos casos,
cuando se parsea tiene el efecto indicado de crear f1, f2 u o1, respectivamente. Es similar en cualquiera de los tres.
El código E tiene el mismo efecto que D1 y D2 juntos: Crear una función generadora y utilizarla para generar un nuevo objeto. He puesto E por ser más completo, pero realmente el caso que más puede interesar es D.
Al parsear D1, se crea el objeto que he llamado g1. Este no debe confundirse con el objeto que se crea cuando se ejecuta D2. En D2 usamos g1 para generar un nuevo objeto, que asignamos a o2. Este (D2) es el único caso en que estamos creando un objeto dinámicamente, en el momento de ejecutar esa línea.
En cualquiera de los otros casos (A,B,C,E), el resultado es el objeto final (f1,f2,o1,o3). En el caso D hay 2 pasos bien diferenciados, D1 y D2.
Pero, para el caso que estás planteando, en realidad D no es un caso relevante.
Así que después de todo este rollo, pasemos a ver tus preguntas...
1º. No entiendo muy bien. ¿Será "más rápida" que cuándo? La función se crea y carga en memoria al parsear el archivo. Una vez creada ahí está.
2º. Lo mismo. El objeto se crea al parsear el fichero (salvo en el caso D2). Es decir, que estamos en la misma situación que en la pregunta anterior. Una vez creado, ahí está.
3º. Esto creo que ya está respondido, no?
4º. Hombre, si sólo te interesa ese único método y el resto sabes que no lo vas a usar nunca, pues sí es un "desperdicio" cargar un montón de código que sabes que no vas a usar. Esto es igual si creas un objeto con 50 funciones que no usas o si creas 50 funciones que no usas en el namespace global. Es lo mismo.
5º. Esto es lo que contestaba ya más arriba. El tema de la organización y la colisión de nombres.
Bueno, ya paro. Espero que hayas sacado algo en claro. Si no, intentaré aclararlo mejor.