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 :

Utilisation du "with"


Sujet :

JavaScript

  1. #1
    Membre habitué Avatar de the-destroyer
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 204
    Points : 125
    Points
    125
    Par défaut Utilisation du "with"
    Bonjour,

    je reste perplexe sur l'utilisation du with, est-ce que cela vaut vraiment le coup de l'utilisé losrque l'on modifie pas mal de valeur d'un objet ? Mais surtout le temps d’exécution n'est-il pas plus de long ? (en micro )

    merci d'avance de vos commentaires !

  2. #2
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    J'aime bien la concision que ça génère (forcément )

    mais il faut être assez sûr de son coup pour en tirer parti;

    tiens, petit condensé de sagesse: https://developer.mozilla.org/fr/R%c...tructions/with

  3. #3
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Personnellement, je n'utilise jamais with. L'intérêt me semble limité, notamment pour les raisons évoquées dans le lien proposé par JT.
    Concernant les performances, j'ai toujours été persuadé qu'effectivement, with était moins optimisé, ce que me confirme un petit test rapide :
    Code html : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <!doctype html> 
    <html lang="fr"> 
     
    <head> 
    	<meta charset="utf-8" /> 
    	<title>with</title>
    	<style>
            </style>
    </head> 
     
    <body>
     
    	<div id="div1">Div de test</div>
    	<button onclick="testWith()">Lancer le test</button>
    	<script type="text/javascript">
                    function testWith(){
                            var divTest, resultat, i;
                            var t = new Date().getTime();
                            for(i=0; i < 1000000; i++){
                                    with(document){
                                            divTest = getElementById('div1');
                                    }
                            }
                            resultat = (new Date().getTime() - t) + ' ms\n';
                            t = new Date().getTime();
                            for(i=0; i < 1000000; i++){
                                    divTest = document.getElementById('div1');
                            }
                            resultat += (new Date().getTime() - t) + ' ms';
                            alert(resultat);
                    }
            </script>
    </body>
    Le résultat sur Firefox est assez éloquent :
    Nom : with.png
Affichages : 71
Taille : 3,1 Ko
    et est confirmé sur tous les navigateurs (IE9, Opera, Chrome et Safari) avec des écarts plus ou moins importants, mais toujours significatifs, de mémoire, jamais moins de 3x plus lent pour with.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  4. #4
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    moralité, ne pas employer with dans une boucle...

  5. #5
    Membre confirmé Avatar de nadox
    Homme Profil pro
    Développeur
    Inscrit en
    Février 2010
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 360
    Points : 551
    Points
    551
    Par défaut
    Bonjour,

    Je n'ai jamais compris les arguments de concision et de lisibilité concernant 'with', puisque l'utilisation d'une variable intermédiaire me semble apporter le même résultat, sans en avoir les inconvénients.

    Je m'explique :
    La lecture n'est en rien simplifiée, comme le montre l'exemple donné dans le lien ci-dessus. Au contraire, on distingue même moins clairement la portée des éléments utilisés.

    La concision ne m'a jamais paru essentielle, surtout qu'elle vient le plus souvent à l'encontre de la lisibilité.

    Dans le cas où on cherche à écrire le moins de code possible, autant utiliser un éditeur qui fait l'auto-complétion des symboles existant déjà dans le fichier. Le code résultant sera toujours lisible, et on se sera moins fatigué !(quoique ctrl+espace ou fleche bas... pffff !!)

    Et si le poids du fichier résultant prends une importance pour un script utilisé en production, on a toujours la possibilité d'activer une compression gzip et/ou de compresser le javascript (certains diront obfusquer) avant de l'envoyer au client.

    Pour finir, même si le petit test de Bovino l'illustre tout à fait, il est assez évident que les performances seront moins bonnes puisque l'utilisation de with provoque systématiquement une phase de recherche supplémentaire. La complexité résultante est donc forcément plus élevée, puisqu'on augmente inutilement le nombre d'opération élémentaire.
    Je n'ai jamais compris (et c'est valable pour tout language) cette recherche de l'expression la plus concise possible (en terme de caractères écrits) surtout si est au détriment des performances ou de la lisibilité.

    Voilà pour mon avis !

  6. #6
    Membre habitué Avatar de the-destroyer
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 204
    Points : 125
    Points
    125
    Par défaut
    Wow que de reponse ^^ :3

    Merci pour vos avis, mais alors cette fonction du noyau javascript ne serait pas a refaire ?

  7. #7
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par nadox
    Voilà pour mon avis !
    Ah ben j'avoue que tu viens d'exprimer parfaitement mon opinion !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with(nadox){
        OK++;
    }
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  8. #8
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par the-destroyer
    mais alors cette fonction du noyau javascript ne serait pas a refaire ?
    Plus exactement, à supprimer selon moi, comme write(), eval() ou autres... D'ailleurs, elle fait partie des Bad Parts évoquées par Douglas Crockford dans JavaScript : gardez le meilleur.

    Le problème, c'est que tu ne peux pas maîtriser le navigateur utilisé par l'utilisateur et que ça force JavaScript à être retrocompatible, donc supprimer des fonctionnalités pourrait amener des sites anciens à ne plus fonctionner.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  9. #9
    Membre habitué Avatar de the-destroyer
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 204
    Points : 125
    Points
    125
    Par défaut
    okay,

    donc l'utilisation est a exclure ? Quan est-ce qu'il mettrons a jour le noyau javascript d’après vous ?

  10. #10
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    petit exemple des seuls cas où j'utilise with

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <script type="text/javascript">
     
    function suite(nbr,inc){
     
    	with(this){
    		add=nbr;
    		pas=inc;
    		tot="Nouvelle suite: ";
    	}
    }	
     
     
    suite.prototype.plus=function(){
    	with (this){
    		if(tot.length<50){
    			alert(tot);
    			add+=pas;
    			tot+=add+"-";
    			setTimeout(function(){plus()},500)
    		}
    	}
    }
     
     
    new suite(45,3).plus();
     
    </script>
    pas vraiment plus court qu'autre chose! Mais ça me parle assez pour que je rentabilise cette instruction singulière;

    ps: pour document.write, c'est effectivement une aberration; pour eval, mon avis est extrêmement réservé: sa puissance contrôlée est fabuleuse (et encore, je n'ai jamais été très loin dans ce sens);

  11. #11
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    J'abonde dans le sens de JT...
    Je n'utilise jamais with en js, mais je comprends son utilisation dans le contexte objet pour la lisibilité du code (factorisation), mais les tests que j'ai pu effectuer sur le with ne m'ont pas convaincu quand à son utilité en gain de vitesse d'execution
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  12. #12
    Membre habitué Avatar de the-destroyer
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 204
    Points : 125
    Points
    125
    Par défaut
    Oui donc a choisir autant gagner en vitesse qu'en visibilité, enfin un code sans with est toujours lisible ou du moins il n'est pas incompréhensible donc autant gagné en vitesse lors de l’exécution de la page

  13. #13
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Plus exactement, à supprimer selon moi, comme write(), eval() ou autres... D'ailleurs, elle fait partie des Bad Parts évoquées par Douglas Crockford dans JavaScript : gardez le meilleur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with(document) {
       write("<script>eval('alert(\"coucou !\"');</script>");
    }

    ...pour les linguistes et les curieux >>> générateur de phrases aléatoires

    __________________

  14. #14
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Grlgxq !… J'ai besoin d'une greffe du cœur de toute urgence.

    C'est marrant parce qu'avant de lire cette discussion j'avais des a priori négatifs sur with, mais sans raison concrète. Maitenant j'en ai ^^

    Mais je comprends à moitié pourquoi il existe. Disons que JS est un langage tolérant – c'est à la fois sa force et sa faiblesse – et with est d'un confort assez extraordinaire quand on ne recherche pas la performance du code.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  15. #15
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Encore plus marrant quand on les cumule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var o1 = {
       prop1: "abc"
    };
    var o2 = {
       prop2: "xyz"
    };
    with(o1) {
       with(o2) {
           alert(prop1+prop2);
       }
    }// l'alert affiche "abcxyz"

    ...pour les linguistes et les curieux >>> générateur de phrases aléatoires

    __________________

  16. #16
    Expert éminent sénior

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Points : 79 912
    Points
    79 912
    Par défaut
    Romain, si après ça tu n'as pas assez de matière pour terminer tes jeux, que devons-nous faire ?

  17. #17
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Citation Envoyé par vermine Voir le message
    Romain, si après ça tu n'as pas assez de matière pour terminer tes jeux, que devons-nous faire ?
    Disons que ce n'est pas la matière qui fait défaut
    Mais promis je vais trouver le temps, c'est vrai que ça fait longtemps que ça me démange... ^^'

    ...pour les linguistes et les curieux >>> générateur de phrases aléatoires

    __________________

  18. #18
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    La concision du code peut devenir un paramètre important dans certains cas. Si le site en question reçoit énormément de requêtes par secondes, par exemple, il vaut mieux rendre le code le plus court possible, et with est une astuce comme une autre pour cela.

    Les pertes de vitesse d'exécution engendrées sont insignifiantes au regard de la puissance des ordinateurs d'aujourd'hui. Moralité, je pense qu'il vaut mieux gagner en performance dans le traitement des requêtes serveur que dans la vitesse d'exécution du code. Sauf dans des cas très très particulier, je pense que la perte est plus grande dans le premier cas.

  19. #19
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Citation Envoyé par Sharcoux Voir le message
    Les pertes de vitesse d'exécution engendrées sont insignifiantes au regard de la puissance des ordinateurs d'aujourd'hui. Moralité, je pense qu'il vaut mieux gagner en performance dans le traitement des requêtes serveur que dans la vitesse d'exécution du code. Sauf dans des cas très très particulier, je pense que la perte est plus grande dans le premier cas.
    Euh, oui... mais là du coup tu défends quelle thèse?

  20. #20
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    petit défi pour ceux que ça passionne (et il y en a visiblement ): créer une instruction without;

    Vous avez 4 heures

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/11/2006, 18h00

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