2010-11-19 17 views
6

Dans une application Web basée sur jQuery, j'ai plusieurs scripts où plusieurs fichiers peuvent être inclus et je n'utilise que l'un d'entre eux à la fois (je ne sais pas tous, mais je suis juste responsable de la JS, ce n'est pas ma décision. Donc, j'enroulant chaque fichier dans une fonction initModule() qui enregistre divers événements et fait une initialisation, etc.Fonctions privées dans JavaScript

Maintenant, je suis curieux de savoir s'il y a des différences entre les deux façons de définir les fonctions qui encombrent l'espace de noms non global suivants:

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

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

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

    /* do some stuff here */ 
} 

et

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

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

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

    /* do some stuff here */ 
} 
+0

Jetez un oeil à [cette question] (http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascript). – jwueller

Répondre

8

la principale différence entre ces deux approches réside dans le fait lorsque la fonction devient disponible. Dans le premier cas, la fonction devient disponible après la déclaration, mais dans le second cas, elle est disponible dans toute la portée (elle s'appelle hissage).

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

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

autre que cela - ils sont fondamentalement les mêmes.

+3

La seule autre différence est que contrairement à une fonction créée par une fonction, une fonction créée par une déclaration de fonction a un nom, qui apparaîtra dans la représentation de la fonction dans certains navigateurs, ce qui peut aider au débogage. Le nom de la fonction apparaît également dans la propriété 'name' de l'objet fonction dans certains navigateurs. –

+0

La déclaration de fonction définit la propriété name de la fonction, mais ce comportement n'est défini par aucune norme, n'est pas pris en charge par les différents navigateurs et ne peut donc pas être utilisé. Mais le point fait est correct - c'est une différence entre la déclaration de la fonction et la déclaration. – Andris

+0

Pour plus de clarté, c'est parce que la déclaration de fonction est "hissée" (entre guillemets car c'est un peu plus compliqué que de simplement déplacer la déclaration) tout comme les déclarations de variables. Lors de l'utilisation d'une expression de fonction, seule la partie de déclaration de variable est levée. – Matt

0

c'est un modèle qui m'a aidé à gérer les modules 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({});