Per impostazione predefinita tutte le variabili (e quindi anche le dichiarazioni di funzione) risiedono nello spazio dei nomi globale.
L'unico modo per introdurre uno spazio dei nomi separato in javascript è con una chiamata di funzione. Ecco come si fa:
(function() {
/* your stuff here */
}());
Si avvolge il proprio materiale in una funzione anonima, quindi si chiama immediatamente. In questo modo le tue funzioni saranno separate, anche con lo stesso nome.
Esempio
Così, per esempio, se si dispone di codice come questo:
var my, local, data;
function initData() {
// use my, local and data here.
}
e si ha qualche altra parte:
var some, other, data;
function initData() {
// use some, other, data here.
}
poi uno initData
sovrascriverà l'altro initData
. Tuttavia, se si avvolgono ciascuno nel proprio (function() {}());
, saranno separati.
(function() {
var my, local, data;
function initData() {
// use my, local and data here.
}
}());
(function() {
var some, other, data;
function initData() {
// use some, other, data here.
}
}());
Attenzione però, che questi nomi non sono più nel namespace globale sono, quindi non sono anche disponibili per l'uso al di fuori della funzione anonima.
Uno globale
Per controllare quanto e cosa si espone nello spazio dei nomi globale, è usanza di esporre ciò che è necessario attraverso un oggetto globale, di solito in tutte le lettere maiuscole.
FOO.module1.initData();
FOO.module2.initData();
Si farebbe questo assicurandosi che FOO esista, e in caso contrario: crearlo.
var FOO = this.FOO || {};
Lo stesso per i vostri spazi dei nomi dei moduli:
FOO.module1 = FOO.module1 || {};
e poi all'interno della funzione anonima, esporre ciò che si desidera.
Esempio completo
module1.JS:
var FOO = this.FOO || {};
FOO.module1 = FOO.module1 || {};
(function() {
var my, local, data;
function initData() {
// use my, local and data here.
}
FOO.module1.initData = initData;
}());
module2.js:
var FOO = this.FOO || {};
FOO.module2 = FOO.module2 || {};
(function() {
var some, other, data;
function initData() {
// use some, other and data here.
}
FOO.module2.initData = initData;
}());
controller.js:
FOO.module1.initData();
FOO.module2.initData();
Un ultimo suggerimento
Il controller, come scritto dipende entrambi module1.js
e module2.js
e deve essere caricato per ultimo. Questo può essere evitato usando qualcosa come , facendo in modo che tutti gli script vengano caricati.
jQuery(document).ready(function() {
FOO.module1.initData();
FOO.module2.initData();
});
Se non stai già utilizzando jQuery, è possibile utilizzare un piccolo script come domReady per evitare la pesantezza.
Cosa intendi con "istanza"? Non sono sicuro di capire. Puoi mostrare un po 'di codice? –
In qualche modo sembra che tu usi le variabili globali ... che ne dici di mostrare il tuo codice? –