Ambiguïté dans les références de fonctions littérales d'objet : remplacement de « ceci » par un littéral d'objet
Une question importante se pose lorsque l'on travaille avec des littéraux d'objet : peut-on une fonction dans un objet fait référence à son objet parent en utilisant le nom du littéral au lieu de « ceci » ? Bien que cela semble fonctionner, cela peut entraîner des conséquences inattendues.
Considérez l'exemple suivant :
var obj = { key1: "it", key2: function() {return this.key1 + " works!"} }; alert(obj.key2());
Ce code déclenche une erreur de console car « ceci » dans la fonction key2 fait référence au global objet (fenêtre) au lieu de l'objet obj. Cette erreur peut être évitée en utilisant le littéral d'objet directement dans la fonction :
var obj = { key1: "it", key2: function() {return obj.key1 + " works!"} }; alert(obj.key2());
Cependant, même cette approche n'est pas à l'abri de problèmes. Analysons deux scénarios supplémentaires :
var obj = { key1: "it", key2: function() { return this.key1 + " works!" } }; var func = obj.key2; alert(func()); // error
Appel de la fonction key2 en tant que fonction autonome (et non en tant que méthode d'obj) rompt la référence 'this' et peut provoquer des erreurs inattendues résultats.
var obj = { key1: "it", key2: function() { return obj.key1 + " works!" } }; var newref = obj; obj = { key1: "something else"; }; alert(newref.key2()); // "something else works"
La modification de la référence obj à partir d'une référence secondaire peut invalider la référence interne de la fonction key2 à la bonne objet.
Pour répondre à ces problèmes potentiels, plusieurs solutions sont disponible :
Le choix de la solution la plus appropriée dépend du contexte spécifique et de la probabilité de rencontrer les problèmes décrits. Néanmoins, il est crucial d'être conscient des pièges potentiels et de prendre les précautions nécessaires lorsque vous travaillez avec des fonctions littérales d'objet.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!