2009-12-24 13 views

risposta

17

Questo è il modo standard per fare il namespace in JavaScript. Se hai appena dichiara

var my_cool_variable = 5; 

sarà globale e potrebbe entrare in conflitto con altre biblioteche, che utilizzano la stessa variabile.

Tuttavia, se si fa

(function() { 
    var my_cool_variable = 5; 
})(); 

ora è variabile locale per la funzione anonima e non è visibile al di fuori della portata di quella funzione. È ancora possibile esporre l'API accessibile non dichiarando var davanti alla variabile, in questo modo sarà globale ma ora puoi scegliere.

2

Ad un livello semplice mantiene il namespace globale pulito (er)

vale a dire:. e 'efficace l'aggiunta di uno strato di avvolgere intorno alle funzioni e le variabili all'interno della libreria, quindi, garantendo non ci sono eventuali scontri namespace con altre funzioni che possono essere in uso da altre librerie, ecc.

7

Se la dichiarazione dell'ambito delle forze. Inserendolo in una funzione ci si assicura che le variabili create e chiamate non vengano nuovamente dichiarate o che non si stiano chiamando accidentalmente variabili dichiarate altrove.

così .....

var variable = 5; // this is accessible to everything in the page where: 

function() 
{ 
    var variable = 7 // this is only available to code inside the function. 
} 

Ecco un link al sito di Douglas Crockford parlando portata in Javascript:

http://javascript.crockford.com/code.html

di follow-up sul commento qui sotto:

L'ambito JavaScript è un po '"rotto":

function() 
{ 
    var x = 3; // accessible in the entire function. 
    //for scope reasons, it's better to put var y = 8 here..... 
    if(x != 4) 
    { 
     var y = 8; //still accessible in the entire function. 
        //In other languages this wouldn't be accessible outside 
        //of the if statement, but in JavaScript it is. 

    } 

} 
+1

perché javascript ha scope di funzione ma non scope. : D –

+0

Pensi che sia rotto? Che ne pensi dell'idea di W3C di scope variabile: considerando questo esempio, se il valore di 'x' è cambiato all'interno del blocco' if (x! = 4) {..} ', il cambiamento verrà visto all'interno di quel blocco ma non al di fuori di esso né dopo. – Esko

1

JavaScript non ha scope di scope, solo scope di funzioni. Creando e invocando immediatamente una funzione anonima, possiamo garantire che le sue variabili locali non passeranno in tutto lo spazio dei nomi globale. È fondamentalmente un modo per limitare i conflitti con altre librerie che potrebbero essere in gioco.

0
var $={} // a name space is defined 

(function($) { 
     $.a_variable="some vale" 
     var b_variable = "some more value"; 
})($); 

$.a_variable // acess it like this. 

ora qualsiasi cosa dentro funzione anonima ha portata pari a quella funzione solo anche noi possiamo creare oggetti che possono agire come proprietà al nostro spazio nome.

Problemi correlati