Pensé que ampliaría la respuesta anterior al hablar sobre cómo encajarían los módulos en una aplicación. Había leído sobre esto en el libro de doug crockford, pero al ser nuevo en javascript, todavía era un poco misterioso.
Vengo de ac # background, así que he agregado algo de terminología que encuentro útil a partir de ahí.
HTML
Tendrá algún tipo de archivo html de nivel superior. Es útil pensar en esto como su archivo de proyecto. Cada archivo de JavaScript que agregue al proyecto quiere entrar en esto, desafortunadamente no obtiene soporte de herramientas para esto (estoy usando IDEA).
Necesita agregar archivos al proyecto con etiquetas de script como esta:
<script type="text/javascript" src="app/native/MasterFile.js" /></script>
<script type="text/javascript" src="app/native/SomeComponent.js" /></script>
Parece que colapsar las etiquetas hace que las cosas fallen, mientras que parece que xml es realmente algo con reglas más locas.
Archivo de espacio de nombres
MasterFile.js
myAppNamespace = {};
Eso es. Esto es solo para agregar una única variable global para que viva el resto de nuestro código. También puede declarar espacios de nombres anidados aquí (o en sus propios archivos).
Módulo (s)
SomeComponent.js
myAppNamespace.messageCounter= (function(){
var privateState = 0;
var incrementCount = function () {
privateState += 1;
};
return function (message) {
incrementCount();
//TODO something with the message!
}
})();
Lo que estamos haciendo aquí es asignar una función de contador de mensajes a una variable en nuestra aplicación. Es una función que devuelve una función que ejecutamos inmediatamente .
Conceptos
Creo que es útil pensar en la línea superior en SomeComponent como el espacio de nombres donde está declarando algo. La única advertencia a esto es que todos sus espacios de nombres deben aparecer primero en algún otro archivo: son solo objetos enraizados por nuestra variable de aplicación.
Solo he tomado pasos menores con esto en este momento (estoy refactorizando algunos javascript normales de una aplicación extjs para poder probarlo) pero parece bastante bueno ya que puedes definir pequeñas unidades funcionales mientras evito el atolladero de 'esto ' .
También puede usar este estilo para definir constructores devolviendo una función que devuelve un objeto con una colección de funciones y no llamándolo inmediatamente.