¿Cuáles serían las debilidades de diseñar una aplicación de una sola página con una variable global (con variables anidadas según corresponda) y un montón de funciones?

En general, para cualquier idioma que desee código modular. En Java, tiene un programa modular al dividirlo en clases e interfaces. En Lisp o Haskell, en su lugar, usaría funciones (o clases de tipo para Haskell).

Básicamente, se trata de un código implícito dado que necesita código modular. Esto significa que puede intercambiar partes de su programa por otras, eliminar partes por completo o agregar algunas nuevas sin grandes cambios de diseño. Si no puede hacer esto, su programa se convierte rápidamente en espagueti (todos hemos visto jQuery salpicado y pirateado por todas partes). El propósito no está claro, la depuración es una pesadilla y olvídate de agregar a tu programa sin encontrar error tras error tras error …

Otra forma de pensar sobre esto son los supuestos. Queremos tener la menor cantidad posible de supuestos sobre nuestro código. Cuando tengo código modular, p. Ej.

  (función () {
   
    var a = function () {
       regreso {
         Hola Mundo'
       };
   };

   var b = (función (a) {
     console.log (a.hello);
   })(una());
 }) ();

Hago algunas suposiciones.

  1. a existe como una función y solo se puede acceder como ‘a’
  2. cuando lo llamo, obtengo un objeto con hola como clave.

¿Qué pasa con el código bajo un espacio de nombres global?

  window.App = {};
 App.a = function () {
   regreso {
     Hola Mundo'
   };
 };

 App.b = function () {
   console.log (App.a (). hola);
 };

 App.b ();

Como abro todo mi código, hago más suposiciones:

  1. window.App existe y no se ha modificado.
  2. window.App.a existe y no se ha modificado.
  3. window.App.b no ha sido modificado.
  4. Llamar a window.App.a devuelve un objeto con hola como clave

Cuando crea esta compleja jerarquía de espacio de nombres debajo de la ventana, pierde modularidad. Se vuelve extremadamente inseguro porque cualquier cosa puede modificar su otro código sin que usted lo sepa. Ya no queda claro dónde está tu comportamiento. Además, se hace muy difícil intercambiar módulos porque están muy integrados, con una gran cantidad de suposiciones.

Hace cinco años no hubieras tenido otra opción. Tenías que usar variables globales y mutación. Afortunadamente, hoy en día tenemos RequireJS, browserify y otras herramientas increíbles que le permiten escribir código que es increíble y modular. Y en la próxima versión de Javascript, los módulos se convertirán en el estándar.