31 votes

Quelle est la valeur de var me = this;

Je trouve ce modèle partout dans le code source ExtJS.

 method: function() {
  var me = this;
  ...
  me.someOtherMethod();
}
 

Pourquoi n'utilisent-ils pas simplement this ? Y a-t-il un avantage à toujours définir me (en dehors de ne pas avoir à taper 2 caractères)? Je peux comprendre s'ils essaient de maintenir le contexte via la fermeture, mais cela se fait dans des endroits où il n'y a pas de fermeture du tout.

Un exemple de Ext.panel.Panel:

 disable: function(silent) {
    var me = this;

    if (me.rendered) {
        me.el.addCls(me.disabledCls);
        me.el.dom.disabled = true;
        me.onDisable();
    }

    me.disabled = true;

    if (silent !== true) {
        me.fireEvent('disable', me);
    }

    return me;
},
 

38voto

jfriend00 Points 152127

Si votre bibliothèque est en train de faire cela dans des endroits où il n'y a pas intégré les fermetures/rappels qui peuvent avoir leur propre valeur de this, alors c'est juste une "pratique" ou "style" ou "convention" qu'ils ont décidé de les suivre dans leurs méthodes. Il n'y a PAS de programmation de raison de toujours le faire.

Dans le codage spécifique exemple, vous avez maintenant ajouté à votre question, il n'y a aucune raison que je suis au courant d'autre qu'une commune, style de codage. Ce code permettrait de générer le même résultat en légèrement plus petit code:

disable: function(silent) {

    if (this.rendered) {
        this.el.addCls(this.disabledCls);
        this.el.dom.disabled = true;
        this.onDisable();
    }

    this.disabled = true;

    if (silent !== true) {
        this.fireEvent('disable', this);
    }

    return this;
},

Quand il y a un rappel de fermeture ou impliqués, c'est souvent parce qu'il y a des rappels utilisé à l'intérieur de la méthode où ils veulent toujours une référence à l' this, mais ces rappels ont leur propre valeur de this le fait de les affecter:

var me = this;

ou, plus communément, dans un autre code que j'ai vu:

var self = this;

est un moyen de conserver l'accès à cet objet, même dans un rappel qui a une valeur différente de this.

Voici un exemple générique:

document.getElementById("myButton").onclick = function () {
    var self = this;       // save reference to button object use later
    setTimeout(function() {
        // "this" is not set to the button inside this callback function (it's set to window)
        // but, we can access "self" here 
        self.style.display = "none";    // make button disappear 2 seconds after it was clicked
    }, 2000);
};

24voto

Daniel A. White Points 91889

L'une des raisons est que, avec la minification, me peut devenir beaucoup plus court que this .

14voto

jfriend00 Points 152127

Outre le style, les motifs et la minification raisons, j'ai décidé de regarder les performances de voir si this ou self a été plus vite. J'ai créé ce jsperf test.

Du mieux que je peux dire, il n'y a fondamentalement pas de différence dans la performance dans tous les navigateurs modernes que j'ai essayé ou même IE6 bewtween l'aide d' this vs à l'aide d'une variable locale comme self ou me. Chrome est très légèrement plus rapide avec self et les autres sont trop proche pour appeler. Je pense qu'on peut écarter aucune des raisons de performances. Voici une capture d'écran des résultats que j'ai vu:

enter image description here

4voto

bmoeskau Points 13136

C'est fait, parfois, à maintenir le champ d'application de la fermeture, mais la plupart du temps (comme dans la posté exemple) afin de permettre la minification comme me peut être minimisé à un seul caractère, tandis qu' this ne peut pas être modifié. Après environ 3 ou 4 utilisations de l' this dans une fonction donnée cela devient important (moins de cela, et qu'il pourrait effectivement se retrouver avec un supplément de quelques octets à partir de l'extra code de déclaration). C'est aussi simple que cela-il n'a rien à voir avec le style de programmation ou de fantaisie.

4voto

brain Points 1355

Le problème est probablement lié aux fonctions de fermeture, par exemple comme argument lorsque vous enregistrez un rappel. Dans ce cas, "ceci" peut avoir une valeur complètement différente, ils doivent donc utiliser "moi" à la place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X