IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Ces deux codes sont-ils équivalent ?


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut Ces deux codes sont-ils équivalent ?
    Bonjour,

    J'ai plusieurs scripts js à charger de façon asynchrone dans ma page.
    (Dons celui de google-analytics qui me sert d'exemple.)

    Le code de base de google-analytics est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <script>
    (function() {
    	var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    	ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    	var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
    })();
    </script>
    Du coups ça donne envie d'écrire une fonction async(src) pour rendre le code plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <script>
    function async(src) {
    	var script = document.createElement('script'); 
    	script.type = 'text/javascript'; 
    	script.async = true;
    	script.src = src;
    	var s = document.getElementsByTagName('script')[0]; 
    	s.parentNode.insertBefore(script, s);
    }
     
    async(('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js');
    //async('un_autre_script');
    </script>
    Mais est-ce vraiment équivalent ?

    Dans le code de google-analytics y'a ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (function() {
     // CODE
    })();
    Qu'est ce que ça fait exactement ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    C'est ce qu'on appelle une fonction anonyme immédiatement invoquée. Cela permet d'éviter la déclaration de variables dans le scope global, car elles sont déclarées dans le scope local de cette fonction anonyme et immédiatement oubliées dès qu'on quitte cette fonction.

    Ton code est certes plus lisible, mais il crée une variable globale async :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <script>function async(src) {
    	var script = document.createElement('script'); 
    	script.type = 'text/javascript'; 
    	script.async = true;
    	script.src = src;
    	var s = document.getElementsByTagName('script')[0]; 
    	s.parentNode.insertBefore(script, s);
    }
     
    async(('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js');
    //async('un_autre_script');
    </script>
    
    <script>
    if("async" in window){
       alert("async est déclaré dans le scope global: "+ async);
    }</script>
    Eviter les variables globales est une bonne pratique car permet de se prémunir des conflits de variables accidentels.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut Merci.
    Merci pour cette réponse rapide et précise

    C'est peut-être plus propre comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MyLIB = {}
    MyLIB.async = function (src) {
    //..
    }
     
    MyLIB.async('ma_source');

  4. #4
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Par défaut
    Au lieu d'avoir une globale async tu as une globale myLIB. Si tu te sers de cette globale myLIB pour mettre toutes les variables que tu as besoin de récupérer partout, c'est effectivement un moindre mal: mieux vaut une seule globale que cinquante. On parle alors de namespace. C'est ce que je fais la plupart du temps.

  5. #5
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    tu peux éviter toute variables en utilisant une closure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <script>
    //ici async n'existe pas
    (function() {
      //ici async est crée
      var async = function(src) {
    	var script = document.createElement('script'); 
    	script.type = 'text/javascript'; 
    	script.async = true;
    	script.src = src;
    	var s = document.getElementsByTagName('script')[0]; 
    	s.parentNode.insertBefore(script, s);
      }
      //ici async n'existe
      async(('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js');
      //async('un_autre_script');
    })();
    //ici async n'existe plus</script>
    A+JYT

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 97
    Par défaut Merci
    Merci à vous deux pour toutes ces précisions.

    Résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/05/2012, 16h44
  2. Réponses: 6
    Dernier message: 12/01/2011, 09h30
  3. Réponses: 5
    Dernier message: 16/06/2010, 10h03
  4. Réponses: 6
    Dernier message: 13/05/2007, 23h14
  5. [Newbie] Ces livres sont-ils corrects ?
    Par Metzgermeister dans le forum C++
    Réponses: 7
    Dernier message: 04/12/2005, 15h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo