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 :

Accéder à une variable en JS OO


Sujet :

JavaScript

  1. #21
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    Quid des performances entre un for et un foreach ? ;-)

  2. #22
    Membre expérimenté Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Par défaut
    Tu es passé sur la page de MDC pour voir la doc de la méthode ?
    https://developer.mozilla.org/En/Cor.../Array/ForEach

    je pense que ça va répondre à ta question… ils disent que ça fait pas parti d'un standard ecmascript puisque celui sur lequel la méthode figure est encore un draft.

  3. #23
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Citation Envoyé par le_chomeur Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	var action = function(){
    	    var t = i ;
    	    return function(){
    		alert(t)
    	    };
    	}(i);
    Merci le_chomeur, je vois bien ce que tu veux dire. Une petite remarque concernant
    ton exemple:

    Tu appelle la fonction associée à action avec la notation (i) après l'accolade fermante
    mais tu ne déclare pas de paramètre dans ta fonction. Si bien que la variable i utilisée
    n'est pas le paramètre mais la variable i de la boucle.

    Ton code fonctionne très bien aussi ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	var action = function(){
    	    var t = i ;
    	    return function(){
    		alert(t)
    	    };
    	}(); // sans rien passer
    Moi je préfère passer explicitement un paramètre ce qui évite la variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	var action = function(t){
    	    return function(){
    		alert(t)
    	    };
    	}(i);
    Ainsi i passe dans t et c'est t qui est "closuré", marche aussi avec t nommé i
    car il s'agirait d'une variable locale qui a priorité sur le i exterieur.

    @DoubleU en effet, la fonction bind présentée dans mon exemple est issue de prototype elle est d'ailleur utilisable dans le cas de l'exemple de funewik.

    bindAsEventListener est similaire mais passe le paramètre 'event' avant les arguments
    (si mes souvenir de prototype sont bons :-) et je pense que si on l'utilise dans ce cas
    alors 'xhr' vaudrait 'undefined' à vérifier.

  4. #24
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    effectivement marcha


    juste a faire TRES attention de ne pas passer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var action = function(){
    	    return function(t){
    		alert(t)
    	    };
    	}(i);
    qui sera l'évènement sinon ( juste une précision pour les autres ^^ )

  5. #25
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Citation Envoyé par nod__ Voir le message
    oui enfin pour les boucles autant utiliser les trucs standards, c'est a dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    monArray = [];
    monArray.forEach(function (valeur, index, tableau) {});
    ...
    La closure est faite toute seule et c'est du JS standard. Mieux que du bricolage
    D'accord quand on manipule des Array, mais document.getElementsByTagName() ne
    retourne pas un Array donc j'éviterai d'utiliser des méthodes d'Array pour manipuler
    des non Array (ou alors les convertir avant, mais ça alourdi le code)

  6. #26
    Membre expérimenté Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Par défaut
    Citation Envoyé par marcha Voir le message
    D'accord quand on manipule des Array, mais document.getElementsByTagName() ne
    retourne pas un Array donc j'éviterai d'utiliser des méthodes d'Array pour manipuler
    des non Array (ou alors les convertir avant, mais ça alourdi le code)
    "Array.forEach" (qui est le même que Array.prototype.forEach) est fait pour manipuler tout ce qui "ressemble" à un array. C'est a dire des index numérique et un "length". Pas besoin de les convertir. Voir l'exemple que le_chomeur m'a demandé.

    Tous les truc du DOM qui ont un ".length" sont ennumérables avec ça, magie.
    https://developer.mozilla.org/en/Cor...y-like_objects

  7. #27
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Par défaut
    Citation Envoyé par nod__ Voir le message
    "Array.forEach" (qui est le même que Array.prototype.forEach) est fait pour manipuler tout ce qui "ressemble" à un array. C'est a dire des index numérique et un "length". Pas besoin de les convertir.
    Nous sommes tout a fait d'accord sur le fait que cela fonctionne.

    Mais je suis pas d'accord que tu as qualifie de "Bricolage" la technique
    qui consiste à itérer un ArrayLike avec une boucle for par rapport
    à l'utilisation de Array.forEach

    Moi je pense que c'est plutôt une mauvaise habitude, un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function show(toto) {
       Array.forEach(toto, function(e) { alert(e); });
    }
    Six mois plus tard, quelqu'un d'autre relis ce code et doit implémenter un affichage
    inversé, il serait tenté de modifier la fonction ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function show(toto, reverse) {
       if(reverse) Array.reverse(toto);
       Array.forEach(toto, function(e) { alert(e); });
    }
    si forEach fonctionne pour les ArrayLike ce n'est pas le cas de Array.reverse
    c'est pourquoi je pense que c'est une mauvaise pratique que de mélanger ces
    deux types.

    C'est pour faire face à ce genre de risque que je parlais de convertir des
    ArrayLike en vrai Array avant d'utilser des méthodes de Array dessus.

  8. #28
    Membre expérimenté Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Par défaut
    ok, vu comme ça.

    Perso je n'ecris presque plus de boucle for. Je suis d'accord avec ta signature :p

  9. #29
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Par défaut
    +1 marcha ,

    de plus j'ajouterais qu'a l'heure actuelle il vaut mieux se baser sur des références CROSSBROWSER

  10. #30
    Membre expérimenté Avatar de nod__
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Par défaut
    Array.prototype.forEach :
    Opera, WebKit, FF.

    Array.forEach :
    FF.
    en rajoutant ces 5 misérables lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (!Array.forEach) {
        Array.forEach = function (array, callback, context) {
            Array.prototype.forEach.call(array, callback, context);
        }
    }
    Opera, WebKit.

    Pour que IE le supporte c'est grand max 10 lignes. C'est encore plus crossbrowser que les getter / setter pour les objets perso, on a vu pire.

    Pour des trucs fun sur les énummérations :
    http://dean.edwards.name/weblog/2006/07/enum/


    ( edit ) J'insiste parce que ça me rend fou cet immobilisme. On peut faire énormément de choses du même genre que ce que jQuery propose en natif. Il suffit de le savoir, et c'est pas en restant sur une boucle for que on va faire bouger les choses. Si assez de monde l'utilise, IE l'implémentera. C'est aussi simple que ça.

  11. #31
    Membre Expert Avatar de DoubleU
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 106
    Par défaut
    En même temps, c'est pas le sujet du topic...

    Et ca reste du sucre syntaxique, donc bon, c'est ptete pas la peine d'épiloguer pendant 20 posts...

  12. #32
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Citation Envoyé par DoubleU Voir le message
    Par ailleurs, vu que tu utilises visiblement la librairie prototype, tu devrais jeter un oeil à la méthode bindAsEventListener qui fait a peu près la même chose que la méthode proposée par marcha mais dans l'api prototype.
    A ce propos , il existe un article très intéressant qui en gros dit que bindasEventlistener ne sert quasi jamais et qu'il faut lui préférer bind()

    http://proto-scripty.wikidot.com/pro...seventlistener
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [Eclipse RCP] accéder à une variable globale
    Par fabrisss dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 10/01/2007, 09h37
  2. Réponses: 4
    Dernier message: 13/12/2006, 17h10
  3. accèder une $variable en bas de page !
    Par Dsphinx dans le forum Langage
    Réponses: 11
    Dernier message: 24/11/2006, 11h23
  4. accéder à une variable déclarée dans un autre fichier
    Par sg.forums dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 31/10/2006, 10h20
  5. [PERL] accéder à une variable d'une autre classe
    Par LE NEINDRE dans le forum Langage
    Réponses: 8
    Dernier message: 11/01/2006, 18h06

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