2010-12-06 17 views
14

Para mantenerme organizado, tengo varios archivos javascript, aunque todos (al final) se minifican juntos para formar un archivo javascript final.

contenidos de cada archivo se envuelven en:

$(document).ready(function(){ 
    //some javascript here 
}); 

Parece como si tengo cosas en archivos separados (en medio de ese código) que no tienen acceso a unos de otros. ¿Es esto un problema de alcance? ¿Que puedo hacer?

Por ejemplo, en un archivo tenía un montón de código para crear tablas a partir de datos recibidos a través de ajax. Sin embargo, la mitad del archivo era solo plantillas para mostrar los datos dependiendo de sus tipos y demás. Me gustaría tener las plantillas en su propio archivo.

Entiendo que esto es solo un problema de "preferencia" y que podría tenerlo todo en un solo archivo.

Pero espero aprender de esto y tal vez incluso ser capaz de hacerlo "a mi manera".

Respuesta

26

Javascript utiliza ámbitos funcionales, por lo que las variables locales dentro de una función no son visibles desde el exterior. Es por eso que su código no puede acceder al código desde otros ámbitos.

La solución ideal para esto es crear un Namespace.

var NS = {}; 

(function(){ 
    function privateFunction() { ... } 
    NS.publicFunction = function(){ ... } 
})(); 

$(document).ready(function(){ 
    NS.publicFunction(); 
}); 

Este es también un modelo útil, ya que le permite hacer una distinción entre & elementos públicos privados.

+0

Tenga en cuenta que si declara su función como 'privateFunctionAttempt = function() {/ * do something * /}', entonces está en el alcance Global. Así que hacer 'console.log (window.privateFunctionAttempt)' mostrará su función en lugar de devolver indefinido como lo haría al hacer 'console.log (window.privateFunction)'. Ver http://stackoverflow.com/questions/11819425/jquery-document-ready-and-function-scope –

1

Es un problema de alcance. Por ejemplo:

function a() { 
    var myHiddenStr = 'abc'; 
} 
alert(typeof(myHiddenStr)); 

No se puede acceder myHiddenStr fuera de la función a. De manera similar, la función anónima que utiliza para documentos listos oculta todo lo que contiene.

Tener un alcance global donde pones cosas de diferentes archivos js no es una buena idea. Probablemente sea mejor tener un controlador de document.ready y llamar a las respectivas funciones desde allí. A continuación, puede obtener los resultados de las funciones y pasarlas a otras funciones que necesitan usarlas.

Cuestiones relacionadas