Ver Mensaje Individual
  #32 (permalink)  
Antiguo 26/05/2014, 11:00
Avatar de Carlangueitor
Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 2 meses
Puntos: 1329
Respuesta: Dudas Javascript

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 original
  1. var num = 0 || 1;  // num == 1
  2. var num = 36 || 0;  // num == 36
  3. var text = "" || "Hola!";  // text == "Hola"
  4. 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 original
  1. var 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:

Código Javascript:
Ver original
  1. var App = {}

El problema con esto es que carece de encapsulación, no puedes tener variables y/o funciones privadas, por ejempo:

Código Javascript:
Ver original
  1. var App = App || {};
  2.  
  3. App._privateValue = 0;
  4.  
  5. App.method = function() {
  6.     /* Magic Here */
  7.     console.log("Ponies and Rainbows: " +  App._privateValue + 10);
  8. };

_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
  1. (function (window) {
  2.     var app = (function () {
  3.         return window.app || (window.app = Object());
  4.     })();
  5.  
  6.     var privateMethod = function() {
  7.         return 0;
  8.     };
  9.  
  10.     app.method = function () {
  11.         /* Magic Here */
  12.         console.log("Ponies and Rainbows: " + privateMethod());
  13.     };
  14.  
  15. })(window);
  16.  
  17. app.privateMethod();  // Manda error;

Creo que eso es a grandes rasgos como funciona.


Saludos
__________________
Grupo Telegram Docker en Español