Domanda

Spesso vedo un oggetto globale definito nel codice javascript di agire come uno spazio dei nomi.

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

Ma a volte, vedo le persone lasciano fuori la parola chiave "var" come

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

Credo nei browser Web se non si definisce una variabile con var, viene messo in oggetto window, che agisce come uno spazio dei nomi globale. Dal momento che consente di risparmiare un paio di byte di testo non si usa "var" c'è un motivo per utilizzare la parola chiave per questo scopo specifico

È stato utile?

Soluzione

  

Dal momento che consente di risparmiare un paio di byte di testo non si usa "var" c'è una ragione per usare la parola chiave per questo scopo specifico?

Non vorrei si consiglia di evitare la parola chiave var, anche se si è sul Codice Globale.

I due modi sembrano simili ma in realtà non sono la stessa cosa, il primo è un di dichiarazione delle variabili , Variabile oggetto il codice globale, è l'oggetto globale in sé, Ecco perché le variabili globali sono accessibili come proprietà dell'oggetto globale (window.MyNS).

Il secondo è un assegnazione non dichiarato , si crea una proprietà sull'oggetto globale, se l'identificatore non si trova nella catena campo di applicazione.

Un vero motivo per evitarlo è che nel nuovo standard del linguaggio, ECMAScript 5th Edition, in Modalità rigorosa , un incarico a un identificatore non dichiarato lancerà una ReferenceError rompere il vostro codice.

C'è anche un altro sottile differenza tra le due esempi, la variabile di istanze crea la proprietà sull'oggetto globale che è non-cancellabili:

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

Mentre l'assegnazione non dichiarato non è:

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

Articolo consigliato:

Altri suggerimenti

L'uso di var definisce una variabile locale nell'ambito corrente. Se siete in ambito globale, essi sono effettivamente equivalenti. L'uso di var v'è di più per la comprensibilità e la manutenibilità, come l'intenzione è assolutamente chiaro. E 'meno chiaro senza inizializzare il var.

In ogni ambito locale, se è da qualche parte MyNS inizializzato la catena del campo di applicazione, sarete sovrascrivendo quella variabile locale piuttosto che la definizione di una variabile globale.

Credo che sia bello usare la parola chiave perché ti prende l'abitudine, e aiuta a prevenire errori di brutto quando si dimentica dentro corpi di funzione. E 'anche bello nel caso in cui alcuni reperti di codice globale per sé migrato in una funzione.

Ma no, non è strettamente necessario.

modifica -. @Eyelidlessness ha davvero un buon punto, anche se se siete codice di battitura a livello globale già non è un problema

Un abbastanza a prova di proiettile modello che ho visto è di inizializzare i namespace globali con qualcosa di simile:

(function(window, undefined) {

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

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

A livello globale, this sarà l'oggetto finestra (se siete in un browser, se no, allora è qualunque sia l'oggetto globale è in quel contesto).

Douglas Crockford su questa domanda esatta: http://www.yuiblog.com/blog / 2008/04/16 / global-dominio-parte-due /

Si stabilisce sull'utilizzo di un commento con l'inizializzazione, ma senza var. La sua analisi dei trade-off è la pena di leggere, anche se non siete d'accordo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top