2009-08-10 4 views
11

¿Existe un enfoque preferido para aislar funciones en un archivo .js de posibles conflictos con otros archivos .js en una página debido a nombres similares?¿Cuál es el mejor enfoque para evitar conflictos de nombres para las funciones de JavaScript en archivos .js separados?

Por ejemplo, si tiene una función

function AddTag(){} 

en Core.js y entonces hay una

function AddTag(){} 

en Orders.js que entren en conflicto. ¿Cómo estructuraría mejor sus archivos .js y qué convenciones de nomenclatura usaría para aislarlos?

Gracias

Respuesta

20

que limitan el alcance de la función a ese archivo.

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

... y, a veces hacen algunas funciones en lo que dispone el ámbito global:

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

Entonces, ¿cómo llamaría a la función en su primer ejemplo? ¿La llamada tiene que estar w/en la función externa? Además, si uno está usando jQuery $ (document) .ready (function() {}); ¿Puedes llamar a estas funciones, por ejemplo, AddTag() desde esa función? ¿La función externa está dentro de $ (document) .ready(), separada o contenida en ella? – ChrisP

+0

AddTag() ;. Sí. Sí, siempre que la llamada esté dentro de la función que limita el alcance. Es una función dentro de la función anónima que escribí (como AddTag). – Quentin

+0

Gracias. Cuando moví el jQuery $ (document) ready ... dentro (function() {} ()); Puedo llamar a las funciones privadas. Gracias – ChrisP

6

Puede usar 'namespacing'. Al igual que este

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); 

Puede invocar como esto:

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

En general no utilizan funciones/variables globales. Lea sobre el patrón del módulo de JavaScript aquí http://yuiblog.com/blog/2007/06/12/module-pattern/

+0

Técnicamente las llamadas de función que muestra arriba no son necesarias. Donde serían útiles es que si tuviera variables locales no quisiera contaminar el espacio de nombres global, ya que Javascript tiene alcance de función. –

+0

Sí, pero es útil si tiene espacios de nombres largos (como los que usa Yahoo). Le ahorra teclear 'This.Is.A.Long.Namespace' cada vez que define una nueva función. Podrías hacer 'o.newFunction = function() {}' –

Cuestiones relacionadas