2010-08-16 21 views
6

A menudo veo un objeto global definido en código JavaScript para actuar como un espacio de nombres.Javascript Global Objects

var MyNS = {a: function() {}, ... }; 

Pero a veces, veo la gente deja fuera la palabra clave "var" como

MyNS = {a: function() {}, ...}; 

Creo en los navegadores web, si no se define una variable con var, se pone en el objeto de la ventana , que actúa como un espacio de nombre global. Como ahorra unos pocos bytes de texto al no usar "var", ¿hay alguna razón para usar la palabra clave para este propósito específico?

Respuesta

8

Como ahorra unos pocos bytes de texto al no usar "var", ¿hay alguna razón para usar la palabra clave para este propósito específico?

No recomendaría que evite la palabra clave var, incluso si está en el Código global.

Las dos formas parecen similares, pero en realidad no son los mismos, la primera es una Declaración variable, la objeto variable el código global, es el objeto global en sí mismo, es por eso que las variables globales son accesibles como propiedades de el objeto global (window.MyNS).

La segunda es una asignación no declarada , crea una propiedad en el objeto global si el identificador no se encuentra en la cadena de alcance.

Una razón real para evitarlo es que en el nuevo estándar del lenguaje, ECMAScript 5th Edition, bajo Strict Mode, una asignación a un identificador no declarado arrojará un código ReferenceError rompiendo su código.

También hay otra diferencia sutil entre los dos ejemplos, la creación de instancias de variables crea de la propiedad en el objeto global que es no puedan eliminar:

var myVar = ''; 
delete window.myVar; // false 
typeof window.myVar; // 'string' 

Mientras que la no asignación no declarada:

myProp = ''; 
delete window.myProp; // true 
typeof window.myProp; // 'undefined' 

Artículo recomendado:

+1

+1 - No solo eso, es simplemente descuidado. Si desea guardar unos pocos bytes, simplemente minimice el código. – ChaosPandion

+0

Entonces, ¿podemos también declarar la variable global por 'window.MyNS = {};' y tener exactamente la misma implicación que 'var MyNS = {};'? – c4il

+2

@Piccolo, bueno, no exactamente * lo mismo *, 'window.MyNS = {};' creará una * propiedad * en el objeto global, mientras 'var MyNS = {};' declarará una variable, y como objeto global, es el Objeto Variable del Contexto de Ejecución Global, también se creará una propiedad global como consecuencia, le recomendaría que eche un vistazo al artículo que enlazo en la respuesta. – CMS

2

El uso de var define una variable local en el ámbito actual. Si estás en el ámbito global, son efectivamente equivalentes. El uso de var es más comprensible y fácil de mantener, ya que la intención es absolutamente clara. Está menos claro sin inicializar el var.

En cualquier ámbito local, si MyNS se inicializa en algún lugar de la cadena de ámbito, sobrescribirá esa variable local en lugar de definir una variable global.

0

Creo que es bueno usar la palabra clave porque te hace el hábito y ayuda a prevenir errores desagradables cuando lo olvidas dentro de los cuerpos de las funciones. También es bueno en caso de que algún código global se encuentre migrado a una función.

Pero no, no es estrictamente necesario.

edición — @eyelidlessness tiene un muy buen punto, aunque si estás escribiendo código a nivel global ya no es un problema.

un patrón bastante a prueba de balas que he visto es inicializar los espacios de nombres globales con algo como esto:

(function(window, undefined) { 

    var foo = { stuff: "in my namespace", ... }; 

    window.foo = foo; 
})(this); 

A nivel mundial, this será el objeto de la ventana (si se encuentra en un navegador, y si no, entonces es lo que sea que el objeto global sea en ese contexto).

-1

Douglas Crockford en esta pregunta exacta: http://www.yuiblog.com/blog/2008/04/16/global-domination-part-two/

Se instala sobre el uso de un comentario con la inicialización, pero sin var. Su análisis de las compensaciones vale la pena leer incluso si no está de acuerdo.

+2

Soy un fan del Sr. Crockford pero IHMO este es uno de sus ** peores ** artículos. Las tres formas que describe son * no completamente equivalentes *, y hay * posibles riesgos * de usar una asignación * no declarada * (la tercera vía) bajo el modo estricto ES5, además, su herramienta JSLint recomienda la directiva '" use strict "' sin verificar casi ninguna de las reglas estrictas más :( – CMS

+0

Creo que es relevante agregar que (obviamente) el artículo es de 2008, por lo que no es de extrañar que algunas cosas hayan cambiado desde entonces. Actualmente estoy leyendo "Javascript" : The Good Parts "(Crockford es el autor, también de 2008) y hay varias secciones del libro que he encontrado hasta ahora que me han descarrilado durante unas horas mientras llego al fondo de la confusión. El libro es altamente recomendado en TODAS PARTES para perfeccionar tus habilidades de Javascript, ¡pero podría haber usado una segunda edición como hace 2 años! – delta9