2 votes

Réutiliser une fonction sans variables globales ?

Il y a quelques jours, j'ai appris par mon propre exemple à quel point les variables et fonctions globales sont mauvaises. Apparemment, la meilleure solution est de ne pas les utiliser, mais tôt ou tard, j'aurai besoin de réutiliser mes variables et fonctions encore et encore.

Ma question est donc la suivante : puis-je réutiliser mes fonctions et mes variables sans les déclarer globalement ? Est-ce possible ?

Par exemple, je veux réutiliser mon alertBox et ma fonction containsP variable plusieurs fois :

DEMO : http://jsfiddle.net/ajmyZ/

//I am BAD GLOBAL FUNCTION inside var 
//But I am reusable!!! 

var alertBox = function () {
    alert("Hey I am BAD function!!")
}

$(document).ready(function () {
    //I am BAD GLOBAL var 
    //But I am reusable TOO!!! 
    var containsP = $("div p:first");
    containsP.click(function () {
        alert("Hi BAD var HERE!!");
    });

    $("p").eq(1).click(function () {
        alertBox();
    });

    //I am the NICEST function here
    //but I am NOT reusable :(

    $("p").eq(2).click(function () {
        alert("I am the NICEST function here!!");

    });

});

4voto

jAndy Points 93076

Je pense que la façon la plus simple d'éviter d'encombrer l'objet global est de créer son propre "contexte d'application". Vous pouvez le faire en créant une fonction qui s'invoque elle-même et qui enveloppe tout votre code js dans chaque fichier.

(function( win ) {
    "use strict";

    var still_global_but_only_in_this_anonymous_closure = true;

    $(document).ready(function() {
         // ...
         // accessing the global object:
         win.some_global_property = true;
    });
}( this ));

En fait, vous créez déjà un tel contexte local avec la fonction anonyme que vous passez dans la fonction .ready() . Il s'agit simplement de la manière la plus explicite. Cette méthode auto-invoquante s'appelle elle-même avec l'objet global comme argument (où vous pouvez toujours accéder explicitement aux variables globales). De plus, en invoquant "use strict"; vous êtes protégé contre la création accidentelle de variables globales alá "Ops_I_Forgot_The_Var_Statment = true;

1voto

jbabey Points 20696

Le code que vous avez posté ne contient pas de variables globales. Une variable déclarée à l'intérieur d'une fonction (dans le cas de votre exemple, la variable anonyme document.ready ) ne sera jamais globale, à moins que vous ne commettiez l'une des deux erreurs suivantes :

  1. oublier les var en créant un mot-clé global implicite
  2. dire explicitement window.myVar = ...;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X