Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Dudas Javascript

Estas en el tema de Dudas Javascript en el foro de Javascript en Foros del Web. dicha expresión es un shorthand de un if/else. el operador OR evalúa una expresión u otra dependiendo del boolean que genera la primera expresión. es ...

  #31 (permalink)  
Antiguo 26/05/2014, 10:57
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Dudas Javascript

dicha expresión es un shorthand de un if/else. el operador OR evalúa una expresión u otra dependiendo del boolean que genera la primera expresión. es decir, en la sentencia window.app || (window.app = Object()), la primera expresión es window.app. dicha expresión no hace nada por si sola. cuando se evalua a boolean (debido al operador OR lógico), si es true, entonces devuelve el resultado de esa expresión. pero si es false, entonces se evalúa la segunda expresión y devuelve el resultado. es exactamente lo mismo que if (!window.app) { window.app = Object(); }. una forma más fácil de entenderlo sería, si no existe algo, entonces hacer tal cosa.

de forma similar sucede con el operador lógico AND, pero de forma contraria. si existe algo, entonces hacer esto. ejemplo, self.alert && self.alert('foo').
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 26/05/2014 a las 11:06
  #32 (permalink)  
Antiguo 26/05/2014, 11:00
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 1 mes
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
  #33 (permalink)  
Antiguo 26/05/2014, 12:02
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 1 mes
Puntos: 292
Respuesta: Dudas Javascript

@zerokilled y @Carlangueitor : les agradezco mucho

@Carlangueitor : super-clara la explicacion ... lo explicado se entendio perfecto pero tocaste otro tema que me tiene confundido: por que usastes una funciones auto-invocadas ?


No hubiera sido lo mismo con funciones no-autoejecutables ? o fue solo para ahorrarte escribir un function call ?


Relacionado con esto, muchas veces me pasa que escribo una funcion auto-invocada y lo que me devuelve es el codigo fuente de la funcion sin evaluar.... nunca doy en el clavo de por que y me toca copy & paste de una funcion auto-invocada bien escrita y me quedo con la "vena" de saber porque me paso esto
__________________
Salu2!
  #34 (permalink)  
Antiguo 26/05/2014, 12:08
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 16 años, 1 mes
Puntos: 1329
Respuesta: Dudas Javascript

Es justamente para no ensuciar el namespace global, y todo lo que conlleva:

Código Javascript:
Ver original
  1. var initApp = function (window) {
  2. };
  3.  
  4. initApp();

Imagina que pasa cuando tienes varios archivos.

Saludos
__________________
Grupo Telegram Docker en Español

Última edición por Carlangueitor; 26/05/2014 a las 12:23

Etiquetas: dudas, funcion, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:33.