2011-10-07 13 views
10

Deseo que mi javascript sea más modular dividiéndolo en diferentes archivos y dándole a cada archivo un espacio de nombres 'sub' como ese.JavaScript Namespacing

subA.js

if(typeof ex == "undefined") { 
    var ex = {}; 
} 

ex.subA = function() { 
//all functions of subA here 
} 

y lo mismo para SubB etc.

Por el momento tengo 1 archivo, ex.js

var ex = (function() { 
    //private vars/funcs 
    return { 
     //public vars/funcs 
    } 
})(); 

parece que me debería mover la mayoría de mis funciones a subA.js y subB.js pero aún incluir ex.js al inicio, con subA.js y subB.js a hacia adelante

Tengo un número de preguntas.

  1. Me está resultando difícil recordar cómo hice el archivo inicial de espacios de nombres, ex.js. Parece que la función anónima está ahí para hacer que todo sea privado inicialmente, pero no puedo recordar por qué debe estar entre paréntesis y luego ejecutada directamente con el (); al final.

  2. Siguiendo desde q1, ¿deberían mis archivos secundarios estar en el mismo formato que ex.js, es decir, tener la función anon entre paréntesis y ejecutada de inmediato?

  3. Parece que los archivos secundarios solo tendrán acceso a las funciones públicas de ex, ¿es así? Si es así, ¿cómo puedo permitir que mis subarchivos accedan a las funciones privadas también?

  4. En mi archivo HTML, en mi función document.ready (jQuery), debo ser la inicialización de ex para una variable o puedo llamar a cada función individual yendo

$(document).ready(function() { 
    ex.doSomething(); 
    ex.doSomethingElse(); 
}

Es Hay una diferencia entre los dos? Creo que cuando se incluye ex.js, se crea inmediatamente una variable global ex (debido a que la función anónima se ejecuta de inmediato), así que no debería necesitar redefinirla en document.ready.

  1. es la primera sentencia if en subA.js diferente de var ex = ex || {}; ¿Qué es mejor?

  2. ¿Qué estándares de estilo de código js usa?

Si lee todo esto, ya se merece un voto positivo, aplausos.

+0

Será mejor que agregue comillas a su comparación 'typeof', y elimine'! Ex': 'if (typeof ex ==" undefined ")'. –

+0

@Rob W ¿Algunos navegadores no devuelven ex como nulo en lugar de 'indefinido'? El código de espaciado de nombre de yahoo usa! Ex – Michael

+0

Cuando una variable nunca se ha definido antes, 'typeof' devolverá' "undefined" '. Algunas propiedades, sin embargo, pueden devolver 'null' (' typeof null === "object" ') cuando se realiza una comprobación. –

Respuesta

5

1. El function(){ return{}} es un cierre para agregar "privacidad" a las variables y funciones que don No quiero ser accesible en ningún otro lado, pero dentro del alcance de esa función. Los paréntesis alrededor de la función (function(){}) crean una expresión de función. Se usan porque el analizador se queja cuando intenta ejecutar una función inmediatamente function(){}() sin pasar ningún argumento al ().

2. Si quiere que subA o cualquier otro objeto que se extienda tenga sus propias funciones secundarias, entonces sí, tiene que declararlo así, pero no necesariamente un remate.

Usted puede hacer

ex.subA = function(x, y){ 
    return x+y; 
} 

que puede ser llamado var sum = ex.subA(2, 3);

O puede hacer

ex.subA = (function(){ 

    return { 
     add: function(x, y){ 
      return x+y; 
     }, 
     multiply: function(x, y){ 
      return x*y; 
     } 
    } 
})(); 

Entonces llaman var sum = ex.subA.add(2, 3); var multiplication = ex.subA.multiply(2,3);

Hay muchas maneras de hacer esto.

3. Sí, es cierto. Puede hacer que las funciones privadas sean públicas. El cierre no permitirá otra forma de hacerlo.

4. Si desea poner un alias, sí se puede asignar a una variable. Sin embargo, no hay necesidad de hacerlo. Funcionará bien de la forma en que lo está describiendo.

Lea Essential JavaScript Namespacing Patterns para comprender algunos fundamentos y patrones en el espacio de nombres de JavaScript.


es la primera sentencia if en subA.js diferente de var ex = ex || {}; ¿Cual es mejor?

Primero de, la instrucción if debe ser if(typeof ex == 'undefined'), la typeof devuelve una cadena. No es necesario verificar si ex es falso.

Sí, es diferente. La instrucción if no hará ninguna asignación de variable si la variable ex ya está definida. Por lo tanto, la declaración if es mejor.

¿Qué estándares de estilo de código js usa usted?

Depende del alcance del proyecto, pero sobre todo objeto profundo que se extiende con una función de ayuda.

+0

Gracias por la increíble respuesta. Tengo algunas preguntas de seguimiento. Para la instrucción 'if (typeof ex == 'undefined')', he escuchado que algunos navegadores devuelven una variable indefinida como 'indefinida', pero otros la devuelven como nula, por eso hay 2 partes en ella.
Con los estándares de estilo de código, estaba hablando más sobre el nombramiento de funciones, etc. pero estoy interesado en este objeto profundo que se extiende con la función de ayuda. ¿Podrías elaborar? ¿Es algo así como jQuery.extend? ¿Pensaría en usar eso para agregar archivos js adicionales en lugar de diferentes espacios de nombres para cada uno? – Michael

+0

@Michael 1) Nunca he encontrado un navegador que haya asignado nulo a una variable indefinida. Sin embargo, soy bastante nuevo en JavaScript. Aunque, creo que has leído que 'NULL' se trata como un objeto, lo cual es otra cosa. Si me puede dar una referencia para esto, me gustaría leerlo. 2) Sí, es algo así como jQuery.extend. Creo que todo se reduce al tamaño del proyecto. Si tiene un proyecto pequeño, puede agregar los espacios de nombres manualmente, tal como está. Si se trata de un gran proyecto, necesitas algún tipo de ayuda para ampliar el espacio de nombres. – Shef

+0

Creo que tienes razón, debo haberlo confundido con otra cosa. – Michael

0

Para las preguntas 1 y 3:

Un Defenition estilo de cierre en los ex.js permitirá a aquellas funciones públicas y VARs/expuestos.

Mi pensamiento es, es mejor devolver "ex" de la función anomia con las funciones y vars que necesitamos para exponer.

para Q3.Esas variables (privadas) definidas y utilizadas en la función devuelta todavía están disponibles para la función y pueden usarse a través de la función expuesta (propiedad de cierre).

Si el script externo incluye se encuentra en la sección o en la parte superior del archivo, el ex debería estar disponible antes document.ready y debe ser utilizable inmediatamente.

Me estás haciendo pienso :) actualizará el cargo como cavo más a esto. Muy buenas preguntas. :)

2

En su diseño, no tendrá acceso a vars/funcs privados definidos en esa función lambda, porque solo devuelve un objeto, o desea usar new?

1.Sin el (), ex es una función, no el objeto que devuelve la función.

2.no es necesario, excepto que desea pasar algunos parámetros para la inicialización. p.ej.

ex.my = (function(name) {var my_name = name;})('bar'); 

3.Creo que me refiero a este método privado.

ex = (function() { 
    var foo = 'bar'; 
    return { 
     show: function() {alert(foo);} 
    } 
})(); 

En el caso anterior, solo ex pueden acceder a foo.

4.no necesidad, $(document).ready() se llama cuando todo está listo, si ya ha cargado ex.js, la inicialización se realiza.

Todo dentro se carga tan pronto como el DOM es cargado y antes de que los contenidos de la página se carga

+0

@ 2 ¿Qué parámetros necesitarían pasar? @ 3 ¿Cómo accedería a las funciones privadas? @ 4 No entiendo lo que quieres decir – Michael