Es bastante sencillo, vamos por partes:
Primero, el operador
OR
funciona de cierta manera, cuando se usa en variables que no son boleanos, devuelve el primer valor si este se evalúa como verdadero, de cualquier otra manera regresa el segundo:
Código Javascript
:
Ver originalvar num = 0 || 1; // num == 1
var num = 36 || 0; // num == 36
var text = "" || "Hola!"; // text == "Hola"
var text = undefined || "Hola!"; // text == "Hola"
Esto nos permite, en este caso tener un mismo
namespace dentro de varios archivos, solo verificas si existe dentro del
scope global y usarlo, o crear el namespace.
Código Javascript
:
Ver originalvar App = App || {}; // Si App está definido, devuelve App. si no, crea un nuevo objeto literal
Si tienes un módulo bastante pequeño puedes omitir eso y hacer directamente un objeto literal:
El problema con esto es que carece de encapsulación, no puedes tener variables y/o funciones privadas, por ejempo:
Código Javascript
:
Ver originalvar App = App || {};
App._privateValue = 0;
App.method = function() {
/* Magic Here */
console.log("Ponies and Rainbows: " + App._privateValue + 10);
};
_privateValue es totalmente accesible, lo cuál no siempre queremos (y no es cuestión de seguridad, como dije antes, es encapsulación).
Entonces probemos otra forma, partiendo de que las variables declaradas de una función son de ámbito local, hacemos la declaración de nuestro namespace en una
función que se auto invoca, y entonces podemos tener mejor encapsulación y exponer solo lo necesario:
Código Javascript
:
Ver original(function (window) {
var app = (function () {
return window.app || (window.app = Object());
})();
var privateMethod = function() {
return 0;
};
app.method = function () {
/* Magic Here */
console.log("Ponies and Rainbows: " + privateMethod());
};
})(window);
app.privateMethod(); // Manda error;
Creo que eso es a grandes rasgos como funciona.
Saludos