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 :

emploi de "this"


Sujet :

JavaScript

  1. #21
    Membre éclairé
    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
    Par défaut
    D'accord. Bon ben c'est parfait. Merci à tous !
    pour la peine je vais vous mettre plein de bons points

  2. #22
    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
    les portée en javascript son à la fois simple et difficiles.

    simple parce qu'il n'y a qu'une seule et unique règle
    un objet est visible de tout contexte d'exécution descendant du contexte dans lequel il a été créé.


    j'ai bien écrit objet que ce soit une variable un objet js une fonction la règle est toujours la même.

    maintenant quelque complication.
    lorsqu'on crée une variable dans une fonction sans utiliser le mot clef var
    celle-ci est crée dans le contexte global.
    si on utilise le mot clef var elle est crée dans le contexte d’exécution de la dite fonction.

    si le code de cette fonction créé lui-même d'autre fonction (locales) les contextes d’exécution de ces fonctions étant fils du précédent la variable leur sera connue.

    un détail d'importance.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    fn1 = function() {
      fn2 = function() {
      };
      var fn3 = function() {
      };
      function fn4() {
      }
    }
    en javascript on peut définir une fonction soit en soir les deux sont équivalente pour la définition mais pas pour la portée.
    dans l'exemple ci dessus lors de l'exécution de fn1 les fonction fn2 fn3 et fn4 sont crées.
    fn2 est un nom définit sans le mot clef var la fonction est donc globale.
    fn3 l'est avec var c'est une fonction locale.
    fn4 est toujours locale.

    la référence this à un fonctionnement identique à celui que l'on trouve dans java. la seule différence avec java est qu'il n'est pas implicite en javascript.
    donc this.toto est toujours différent de toto
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var a = {
      toto:45,
      show: function () {
        alert(this.toto); //ici this c'est l'objet a
      }
    };
    pour les développeur java la notion de fonction n'existe pas seule les méthodes pleuvent l'être.
    en javascript une fonction est un objet this dans le corps de la fonction représente l'objet lui-même soit donc la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var fn = function() {
      this.toto =45; 
      alert(this.toto);
    };
    fn(); //ici dans le corps de la fonction this c'est l'objet fonction : fn
    alert(fn.toto);
    le piège est que si j'utilise fn comme constructeur d'objet alors this n'est plus la fonction mais l'objet construit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var fn = function() {
      this.toto =45; 
      alert(this.toto);
    };
    var b = new fn(); //ici dans le corps de la fonction this c'est l'objet construit b
    alert(b.toto);
    les closures :
    l'utilisation de corps de fonction pour isoler des espace d'objet se nome closure le plus souvent on utilise des fonctions anonymes Le pb est que pour pouvoir invoquer une fonction il faut en avoir une référence (un non en général mais là elle est anonyme). On indique à l'interprète qu'on va utiliser le résultat de cette définition en le plaçant entre () ceci est une référence à la fonction anonyme définie dans les (). pour l'invoquer il suffit donc comme avec tout référence de faire un appel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (fn() {var a = 45; ...})()
    ainsi le code entre {} est exécuté et les objets définit à l’intérieur sont détruit
    dès qu'il n'existe plus de référence à ce bloc.


    A+JYT

  3. #23
    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 : 55
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Excellentes explications !

    Mais à un détail près selon moi :
    en javascript une fonction est un objet this dans le corps de la fonction représente l'objet lui-même soit donc la fonction.
    Non, this représente toujours l'objet qui l'a appelé, donc, dans le cadre d'une fonction comme dans ton exemple, this représente l'objet window :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var fn = function() {
      this.toto =45; 
      alert(this);    // affiche [object Window]
    };
    fn(); //ici dans le corps de la fonction this c'est l'objet fonction : fn
    alert(fn.toto+' - ' + toto);    // affiche undefined - 45 => toto a bien été défini pour l'objet window ;)
    en revanche, si l'on se sert de la fonction comme constructeur, this représentera bien l'instance de l'objet puisque c'est elle qui a appelé le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var fn = function() {
      this.toto =45; 
      alert(this);    // différent selon l'appel
    };
    fn(); //ici dans le corps de la fonction this c'est l'objet fonction : fn
    alert(fn.toto+' - ' + toto);
    var inst = new fn();
    alert(inst.toto);    // 45
    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. #24
    Membre éclairé
    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
    Par défaut
    Merci Bovino et sekajin. C'était des super explications ! Hésitez pas à faire un tuto à partir de ce topic. Je suis sûr que ça peut aider bcp de monde, parce que ces subtilités constituent justement le point du javascript que je trouve le plus obscure et sur lequel ont ne trouve généralement que des informations confuses, partielles et même parfois carrément FAUSSES !

  5. #25
    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
    oui sorry pour window

    je réfléchissais en pensant à js hors du navigateur

    Meaculpa

    A+JYT

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. onmouseover="Menu_HoverStatic(this)" object expected
    Par cyrano_de_bergerac dans le forum ASP.NET
    Réponses: 0
    Dernier message: 01/10/2010, 17h01

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