Existe-t-il une meilleure façon de référencer un périmètre externe à cela en Javascript?

StackOverflow https://stackoverflow.com/questions/1429380

  •  07-07-2019
  •  | 
  •  

Question

J'ai récemment vu et écrit de nombreuses méthodes javascript de ce type:

var myObj = {
  dialogOptions: {...},
  init: function() {
    var $this = this;
    var something = $("<div/>").load("...", null, function() {
      $(this).dialog($this.dialogOptions);
    });
  }
}

Maintenant, cela fonctionne en raison de la nature des fermetures, mais la référence de la variable nommée au niveau particulier de la portée semble maladroite. Ma question est la suivante:

Existe-t-il un opérateur javascript qui exécute var $ this = this; sur la portée interne? Ou peut-être existe-t-il un moyen de parcourir la hiérarchie des objets pour obtenir la propriété que je recherche dans la portée interne?

Était-ce utile?

La solution

Réponse courte: Nope.

Réponse longue: le " problème " est la nature unique de this dans un langage où tout est un objet. Vous ne pouvez pas choisir à quel moment cela signifie ceci ceci ou autre ceci.

C'est du javascript pour vous. Vous pouvez faire beaucoup, mais ce n'est pas toujours joli.

Autres conseils

Il n’existe aucun moyen précis d’éviter cela. Cependant, certaines bibliothèques offrent un moyen de lier des fonctions à des portées spécifiques, permettant généralement une syntaxe comme celle-ci:

(function() { /* do something */ }).bind(whatever)

En fonction de vos goûts, cela peut être plus propre que de déclarer l'étendue dans une variable distincte. La liaison dans le contexte ci-dessus est essentiellement la suivante:

Function.prototype.bind = function(scope) {
    var thisFunction = this;
    return function() {
        thisFunction.call(scope);
    };
};

Dans ce cas, si myObj est une variable globale (ou globalement accessible), je procède souvent comme suit:

var myObj = {
  dialogOptions: {...},
  init: function() {
    var something = $("<div/>").load("...", null, function() {
      $(this).dialog(myObj.dialogOptions);
    });
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top