2009-08-10 7 views
11

Existe-t-il une approche privilégiée pour isoler des fonctions dans un fichier .js de conflits potentiels avec d'autres fichiers .js sur une page en raison de noms similaires?Meilleure approche pour éviter les conflits de noms pour les fonctions javascript dans des fichiers .js distincts?

Par exemple, si vous avez une fonction

function AddTag(){} 

dans Core.js puis il y a une

function AddTag(){} 

en Orders.js ils seraient en conflit. Comment structureriez-vous au mieux vos fichiers .js et quelles conventions de nommage utiliseriez-vous pour les isoler?

Merci

Répondre

20

Je limite la portée de la fonction à ce fichier.

(function() { 
    var AddTag = function AddTag() { 
    }; 
}()); 

... et parfois faire quelques fonctions à la disposition de la portée mondiale:

var thisNamespace = function() { 
    var AddTag = function AddTag() { 
     … 
    }; 
    var foo = function foo() { 
     AddTag(); 
     … 
    }; 
    var bar = function bar() { 
     … 
    }; 
    return { 
     foo: foo, 
     bar: bar 
    } 
}(); 
+0

Alors, comment appelleriez-vous la fonction dans votre premier exemple? L'appel doit-il être w/dans la fonction externe? De plus, si on utilise jQuery $ (document) .ready (function() {}); pouvez-vous appeler ces fonctions, par exemple, AddTag() à partir de cette fonction? Est-ce que la fonction externe à l'intérieur de $ (document) .ready(), séparée, ou contenue w/dedans? – ChrisP

+0

AddTag() ;. Oui. Oui - tant que l'appel est dans la fonction limitant la portée. C'est une fonction à l'intérieur de la fonction anonyme que j'ai écrite (tout comme AddTag). – Quentin

+0

Merci. Lorsque je me suis déplacé le jQuery $ (document) .ready ... intérieur (function() {} ()); Je peux appeler les fonctions privées. Merci – ChrisP

6

Vous pouvez utiliser 'namespacing'. Comme cette

File1.js: 

var Orders = {} 
(function(o) { 
    o.function1 = function() {} 
    o.function2 = function() {} 
})(Orders); 

File2.js 

var Sales = {} 
(function(o) { 
    o.function1 = function() {} 
    o.function2 = function() {} 
})(Sales); 

Vous pouvez les appeler comme ceci:

Sales.function1(); 
Orders.function1(); 

En général ne pas utiliser les fonctions globales/variables. Lisez à propos du modèle de module javascript ici http://yuiblog.com/blog/2007/06/12/module-pattern/

+0

Techniquement, les appels de fonction que vous montrez ci-dessus ne sont pas nécessaires. Là où ils seraient utiles, c'est que si vous aviez des variables locales, vous ne vouliez pas polluer l'espace de noms global, puisque Javascript a une portée de fonction. –

+0

Oui, mais c'est utile si vous avez de longs espaces de noms (comme ceux que Yahoo utilise). Il vous évite de taper 'This.Is.A.Long.Namespace' à chaque fois que vous définissez une nouvelle fonction. Vous pouvez juste faire 'o.newFunction = function() {}' –

Questions connexes