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 :

changer de this dans l'appel d'une fonction anonyme


Sujet :

JavaScript

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 194
    Points : 96
    Points
    96
    Par défaut changer de this dans l'appel d'une fonction anonyme
    bonjour

    Comment fait on pour modifier le this d'une fonction de callBack?

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //méthode init de la classe maClasse
    init : function(){
        //this => objet instancié de maClasse
        if(window.navigator.geolocation){
    	    window.navigator.geolocation.getCurrentPosition(function(position){
                    //this => PAS objet instancié de maClasse
                    //comment faire pour que ce soit le cas
                });
        }
    }
    merci

  2. #2
    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 638
    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 638
    Points : 66 667
    Points
    66 667
    Billets dans le blog
    1
    Par défaut
    this n'est pas modifiable

    tu peux faire this=that
    modifier that et retourner that

    du coup tu est obligé de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objet=objet.mafontion()
    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 !

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 194
    Points : 96
    Points
    96
    Par défaut
    biensur qu'il est modifiable...
    J'arrive à le faire via mootools avec la méthode bind

    http://mootools.net/docs/core/Types/...#Function:bind

    Mais je n'y arrive pas en "natif".

  4. #4
    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 638
    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 638
    Points : 66 667
    Points
    66 667
    Billets dans le blog
    1
    Par défaut
    c'est du prototype this n'est pas modifiable dans une fonction anonyme !
    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 !

  5. #5
    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 638
    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 638
    Points : 66 667
    Points
    66 667
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    String.prototype.bar=function(){
    this= this.toUpperCase()
    return this
    }
    alert("coucou".bar())
     
     
     
    String.prototype.foo=function(){
    return this.toUpperCase()
    }
    alert("coucou".foo())
    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 !

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 194
    Points : 96
    Points
    96
    Par défaut
    Dès que ça parle de prototype je suis pommé :s

    Quand je fais avec mootools j'ai bien mon this, comment faire sans mootools?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //méthode init de la classe maClasse
    init : function(){
        //this => objet instancié de maClasse
        if(window.navigator.geolocation){
    	    window.navigator.geolocation.getCurrentPosition(function(position){
                    //this => objet instancié de maClasse
                }.bind(this));
        }
    }

  7. #7
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par kimcharlene Voir le message
    Dès que ça parle de prototype je suis pommé :s

    Quand je fais avec mootools j'ai bien mon this, comment faire sans mootools?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //méthode init de la classe maClasse
    init : function(){
        //this => objet instancié de maClasse
        if(window.navigator.geolocation){
    	    window.navigator.geolocation.getCurrentPosition(function(position){
                    //this => objet instancié de maClasse
                }.bind(this));
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var that = this;
    window.navigator.geolocation.getCurrentPosition(function(position){
                    //that => objet instancié de maClasse
                });
    autrement tu rédéfinis bind toi-même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Function.prototype.bind = function(obj){
      var fn = this;
      return function(){ fn.apply(obj,arguments);};
    }
    sinon le mélange des 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var that = this;
    window.navigator.geolocation.getCurrentPosition(function(pos){
                    return (function(position){
                                    //ton code ici avec le bon this;
                    }).call(that,pos);
                });
    edit: ayant codé la dernière fonction à l'aveugle, j'ai quand même été pris d'un doute et je me suis fait un petit test et "oh surprise, ça fonctionne nickel du premier coup", j'suis trop fier de moi.
    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
    function callback(fn){
    	fn();
    }
     
    function init(){
    	this.instance = "instance de init";
    	var that = this;
    	callback(function(pos){
                    return (function(position){
                                    alert(this.instance);
                    }).call(that,pos);
    	});
    }
     
    new init();
    edit2: window.navigator.geolocation.getCurrentPosition n'existe pas sous IE
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    194
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 194
    Points : 96
    Points
    96
    Par défaut
    j'ai opté pour la définition du bind par moi même, je trouve cette solution bcp plus élégante.

    Je vous remercie pour cette aide précieuse, ça marche niquel maintenant .

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

Discussions similaires

  1. Espace dans l'appel d'une fonction
    Par pierre50 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/12/2007, 11h19
  2. Variable en option dans l'appel d'une fonction
    Par xian21 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 19/11/2007, 15h13
  3. Réponses: 4
    Dernier message: 30/08/2007, 18h08
  4. [PHP-JS] Variable PHP comme argument dans l'appel d'une fonction Javascript
    Par The Molo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/04/2007, 09h00
  5. pb dans l'appel d'une fonction
    Par badboys206s16 dans le forum ASP
    Réponses: 3
    Dernier message: 04/07/2006, 08h32

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