2010-11-19 21 views
6

En una aplicación web basada en jQuery, tengo varias secuencias de comandos en las que se pueden incluir varios archivos y solo estoy usando uno de ellos a la vez (sé que no incluirlos a todos sería mejor, pero Soy el responsable del JS, así que esa no es mi decisión). Así que estoy envolviendo cada archivo en una función initModule() que registra varios eventos y hace algo de inicialización etc.Funciones privadas en JavaScript

Ahora estoy ansioso por ver si hay alguna diferencia entre las dos formas siguientes de la definición de funciones no saturan el espacio de nombres global:

function initStuff(someArg) { 
    var someVar = 123; 
    var anotherVar = 456; 

    var somePrivateFunc = function() { 
     /* ... */ 
    } 

    var anotherPrivateFunc = function() { 
     /* ... */ 
    } 

    /* do some stuff here */ 
} 

y

function initStuff(someArg) { 
    var someVar = 123; 
    var anotherVar = 456; 

    function somePrivateFunc() { 
     /* ... */ 
    } 

    function anotherPrivateFunc() { 
     /* ... */ 
    } 

    /* do some stuff here */ 
} 
+0

Tome un vistazo a [esta cuestión] (http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascript). – jwueller

Respuesta

8

la principal diferencia entre estos dos enfoques reside en el hecho cuando la función esté disponible. En el primer caso, la función está disponible después de la declaración, pero en el segundo caso está disponible en todo el alcance (se llama alzando).

function init(){ 
    typeof privateFunc == "undefined"; 
    var privateFunc = function(){} 
    typeof privateFunc == "function"; 
} 

function init(){ 
    typeof privateFunc == "function"; 
    function privateFunc(){} 
    typeof privateFunc == "function"; 
} 

que no sea eso - son básicamente lo mismo.

+3

La única otra diferencia es que a diferencia de una función creada por una exprersión de función, una función creada por una declaración de función tiene un nombre, que aparecerá en la representación de cadena de la función en algunos navegadores, que puede ayudar cuando se depura. El nombre de la función también aparece en la propiedad 'name' del objeto de función en algunos navegadores. –

+0

La declaración de función establece el nombre de la propiedad de la función, pero este comportamiento no está definido por ningún estándar, es poco compatible con diferentes navegadores y por lo tanto no se puede confiar en él. Pero el punto es correcto: esta es una diferencia entre declaración de función y declaración. – Andris

+0

Para mayor claridad, esto se debe a que la declaración de la función es "izada" (las comillas porque es un poco más complicado que simplemente mover la declaración) al igual que las declaraciones de variables. Cuando se utiliza una expresión de función, solo se iza la porción de declaración de variable. – Matt

0

este es un modelo que me ayudó a gestionar módulos en javascript:

base.js:

var mod = {}; 

mod.functions = (function(){ 

    var self = this; 

    self.helper1 = function() { 

    } ; 

    self.helper2 = function() { 

    } ; 

    return self; 

}).call({}); 

module_one.js

mod.module_one = (function(){ 

    var 
    //These variables keep the environment if you need to call another function 
    self = this, //public (return) 
    priv = {}; //private function 

    priv.funA = function(){ 
    } 

    self.somePrivateFunc = function(){ 
    priv.funA(); 
    }; 

    self.anotherPrivateFunc = function(){ 

    }; 

    // ini module 

    self.ini = function(){ 

    self.somePrivateFunc(); 
    self.anotherPrivateFunc(); 

    }; 

    // ini/end DOM 

    $(function() { 

    }); 

    return self; // this is only if you need to call the module from the outside 
       // exmple: mod.module_one.somePrivateFunc(), or mod.module_one.ini() 

}).call({}); 
Cuestiones relacionadas