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 :

Testez vos connaissances avec un Quiz sur l'usage avancé des fonctions en JavaScript


Sujet :

JavaScript

  1. #21
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    C'est-à-dire ? Si tu as un exemple je suis curieux de voir les différences avec ou non l'activation du strict mode

    Merci NoSmoking pour l'explication. C'est vrai que l'écriture "Macro" est plus familière.

  2. #22
    Membre confirmé Avatar de getz85
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2008
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 423
    Points : 462
    Points
    462
    Par défaut
    Votre score : 5 / 10


    Il n'y a que les questions sur les closure où j'étais certain des réponses, le reste j'ai tenté ce qui me semblait le plus logique mais ça n'a pas vraiment fonctionné.

    Et pour la question Bonus, définitivement la réponse D

  3. #23
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    740
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 740
    Points : 805
    Points
    805
    Par défaut
    Citation Envoyé par Kaamo Voir le message
    C'est-à-dire ? Si tu as un exemple je suis curieux de voir les différences avec ou non l'activation du strict mode

    Merci NoSmoking pour l'explication. C'est vrai que l'écriture "Macro" est plus familière.
    Facile...

    À la question 2...
    À la question 4...
    ... lèveront une exception

    À la question 7, la proposition 1 retournera undefined

    ... bref, 7/10 pour SylvainPV
    Afin d'obtenir plus facilement de l'aide, n'hésitez pas à poster votre code de carte bancaire

    Mon GitHub

    Une alternative à jQuery, Angular, Vue.js, React, ... ? Testez anticore, en quelques secondes à peine !
    (Contributions bienvenues)

  4. #24
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    Si l'on était en mode strict, je l'aurais précisé... A la question 2 et 4, aucune des propositions ne mentionnent une exception donc on ne pouvait pas se tromper. Et mode strict ou pas, la proposition 1 de la question 7 reste la proposition 1 de la question 7. Pourquoi voudrais-tu qu'elle change ?

    Désolé Lcf, il va te falloir trouver une autre excuse pour tes points perdus
    One Web to rule them all

  5. #25
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    740
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 740
    Points : 805
    Points
    805
    Par défaut
    Bah, je ne cherchais pas d'excuses, surtout avec un 9/10, tout comme je ne disais pas que j'y ai répondu en me basant sur le strict mode, juste que je trouve dommage d'encore illustrer du non-strict.

    Et, pour la question 7, je voulais simplement dire qu'en strict mode, l'explication de la première proposition ne tient plus.
    Afin d'obtenir plus facilement de l'aide, n'hésitez pas à poster votre code de carte bancaire

    Mon GitHub

    Une alternative à jQuery, Angular, Vue.js, React, ... ? Testez anticore, en quelques secondes à peine !
    (Contributions bienvenues)

  6. #26
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    740
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 740
    Points : 805
    Points
    805
    Par défaut
    Citation Envoyé par SylvainPV Voir le message
    On peut en effet s'en servir pour se passer de 'this', ou éviter un appel manuel à call, donc la bonne proposition de la Q11 est la B :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var cloneArray = Function.bind.bind(Function.call)(Array.prototype.slice);
    Autant j'aime beaucoup le binding, autant il faut quand même faire gaffe à ne pas en abuser car son coût, en performances, est assez désastreux.

    À titre d'exemple, avec le code en citation, 1 seul appel à cloneArray coûte environ 17 fois un appel à Array.slice.call :

    • Le bindind, lui-même : 15.3 fois
    • Chaque appel : 1.7 fois


    Donc, réponse "e", à perdre en performances?
    Afin d'obtenir plus facilement de l'aide, n'hésitez pas à poster votre code de carte bancaire

    Mon GitHub

    Une alternative à jQuery, Angular, Vue.js, React, ... ? Testez anticore, en quelques secondes à peine !
    (Contributions bienvenues)

  7. #27
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    Tu es sûr de tes tests ? La différence est mineure pour moi sur Chrome

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    console.time("cloneArray");
    for(var i=0; i<99999; i++){ Array.prototype.slice.call([1,2,3]); }
    console.timeEnd("cloneArray");
     
    // cloneArray: 102.637ms
     
    var cloneArray = Function.bind.bind(Function.call)(Array.prototype.slice);
    console.time("cloneArray bbc");
    for(var i=0; i<99999; i++){ cloneArray([1,2,3]); }
    console.timeEnd("cloneArray bbc");
     
    // cloneArray bbc: 111.255ms
    One Web to rule them all

  8. #28
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    740
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 740
    Points : 805
    Points
    805
    Par défaut
    Perso, je n'ai pas testé en termes de vitesse d'exécution mais en termes de mémoire utilisée
    Afin d'obtenir plus facilement de l'aide, n'hésitez pas à poster votre code de carte bancaire

    Mon GitHub

    Une alternative à jQuery, Angular, Vue.js, React, ... ? Testez anticore, en quelques secondes à peine !
    (Contributions bienvenues)

  9. #29
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    Je ne vois pas pourquoi bind ferait augmenter 17 fois la mémoire utilisée. Tu as une suite de test à montrer ? Comment repères-tu la mémoire allouée spécifiquement pour une portion de code ?

    Avec la Heap Timeline de l'inspecteur Chrome, j'observe au contraire un pic de mémoire plus haut pour la méthode sans bind : http://i.imgur.com/SSqO3N2.png ; bien que je ne sois pas un expert en allocation mémoire, peut-être que je me trompe dans l'interprétation de ces résultats.
    One Web to rule them all

  10. #30
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    740
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 740
    Points : 805
    Points
    805
    Par défaut
    Hum, mea culpa, j'ai dû mal interpréter les chiffres

    Le binding est coûteux, très coûteux mais les appels sont sacrément plus performants avec ton code.

    Pour ce qui est de tester l'usage de la mémoire, j'fais cela sous node

    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
    var i,
        heap,
        cloneArray;
     
    i = 0;
    heap = process.memoryUsage().heapUsed;
    cloneArray = Function.bind.bind(Function.call)(Array.prototype.slice);
     
    for (; i < 99999; i += 1) {
        /*/
        Array.prototype.slice.call([1,2,3]); // 1170304
        /*/
        cloneArray([1,2,3]); // 688264
        //*/
    }
     
    console.log(process.memoryUsage().heapUsed - heap);
    Afin d'obtenir plus facilement de l'aide, n'hésitez pas à poster votre code de carte bancaire

    Mon GitHub

    Une alternative à jQuery, Angular, Vue.js, React, ... ? Testez anticore, en quelques secondes à peine !
    (Contributions bienvenues)

  11. #31
    Membre averti
    Profil pro
    à la bougie alors
    Inscrit en
    Mai 2006
    Messages
    224
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : à la bougie alors

    Informations forums :
    Inscription : Mai 2006
    Messages : 224
    Points : 362
    Points
    362
    Par défaut
    On est d'accord que ce sont des tests pour de faux ? alors j'ai testé en plus
    [1,2,3].slice() bin pas besoin d'acrobaties pour "cloner" un tableau, et c'est encore la version la plus rapide
    Mais aussi une bête fonction genre: clone = new Array(array.length) et un boucle de copie for ( var i= .... C'est aussi rapide que slice.call étonnament enfin avec Rhino et Ffx.
    Et qu'est-ce que vous faites du gc ? et les optimisations sur la création des tableaux ? et les optimisations tout court des moteurs ? et puis dans un navigateur ... Mm ... M'enfin, j'arrive à des écarts à peu près stables entre la version la plus lente et la plus rapide de l'ordre de 15 à 20%
    Et avec cloneArray = Function.call.bind(Array.prototype.slice) ça vous donne quoi ?

  12. #32
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    On est partis sur un débat sur les performances assez hors sujet... Le but de cette question bonus n'était pas de trouver la manière la plus rapide de clôner une Array, mais de trouver un exemple retors utilisant des fonctions sur d'autres fonctions.

    Ici, la fonction f prend en paramètre une fonction et fera en sorte que cette fonction soit appelée en décalant les arguments d'un rang vers la droite, le premier argument devenant le contexte d'appel. C'est donc un moyen commode de "déméthodiser" une fonction dans le cas où on doit l'appeler régulièrement avec des contextes d'appels différents. Il existe plusieurs autres variantes dont celle-ci qui sépare passage du contexte et des arguments en deux appels consécutifs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var superbind = Function.bind.bind(Function.bind);
    superbind([].slice)([1,2,3,4])(1,3) // [2, 3]
    Pour une utilisation pratique de ce genre de fonctions, par exemple pour de la curryfication, le code est plus verbeux et plus explicite, donc inexorablement moins fun.
    One Web to rule them all

  13. #33
    Rédacteur/Modérateur

    Avatar de yahiko
    Homme Profil pro
    Développeur
    Inscrit en
    Juillet 2013
    Messages
    1 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 1 423
    Points : 8 699
    Points
    8 699
    Billets dans le blog
    43
    Par défaut
    Sympa ce test sur les fonctions.
    J'espère qu'il y en aura d'autres
    Tutoriels et FAQ TypeScript

  14. #34
    Membre expérimenté Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Points : 1 537
    Points
    1 537
    Par défaut
    arf ... 7/10

    bon test mais j'aurais des questions/precisions/corrections ...



    Q8 : il ne suffit pas de creer une fonction dans une fonction pour avoir une closure ... la fonction principale doit renvoyer la fonction interne comme resultat ... non ?
    ou alors la fonction interne doit etre appelé dans la fonction principale.

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function stockEtProtege(){
        var valeurPrive = "coucou";
        return function(){
            return valeurPrive;
        };
    }
    valeur = stockEtProtege();
    console.log(valeur());

    mais ceci n'est pas une closure, ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function a(){
      function b(){
      }
    }

    Q9 : faudrait peut etre etre + precis dans la réponse ? (meme si l'explication sous la réponse donne toutes les infos)
    Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
    Mon blog : http://web.codeur.free.fr

  15. #35
    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
    Points : 9 944
    Points
    9 944
    Par défaut
    Q8: Si je m'en tiens à la définition MDN:
    Les fermetures, ou closures en anglais, sont des fonctions qui utilisent des variables libres.


    On pourrait donc extrapoler en disant que toute fonction en JavaScript est une closure, dans le sens où elle a cette propriété de pouvoir se référer à des variables de portée supérieure, non locales donc libres. Bien sûr ce n'est pas le sens habituel qu'on leur prête : quand on mentionne les closures, c'est généralement dans le but d'utiliser leurs propriétés (d'où la question qui suit, à quoi servent les closures). Retourner la fonction interne est un cas d'utilisation possible, mais pas le seul (voir les différents exemples sur la page MDN). Dans tous les cas, aucun doute sur la réponse possible.

    Q9: la réponse est volontairement floue pour couvrir tous les cas d'utilisation possibles des closures. Je ne peux pas être exhaustif et précis à la fois. Les compléments d'infos dans la réponse après avoir fini le quiz sont là pour apporter ces précisions.
    One Web to rule them all

  16. #36
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 646
    Points : 11 135
    Points
    11 135
    Par défaut
    5/10
    bon comme ça fait un bail que je n'ai pas pratiqué le JS, j'estime que je ne m'en sors pas trop mal

  17. #37
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2014
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Hum 2/10...

Discussions similaires

  1. Réponses: 30
    Dernier message: 28/03/2015, 13h21
  2. Réponses: 0
    Dernier message: 20/10/2014, 10h02
  3. Testez vos connaissances avec le deuxième Quizz JavaScript
    Par vermine dans le forum Général JavaScript
    Réponses: 46
    Dernier message: 07/05/2014, 17h38

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