L'avantage de ceci est que les fonctions internes peuvent accéder aux paramètres et variables de la fonction externe dans laquelle elles sont définies.
Tout d’abord, construisons un objet simple.
var testObj = {
valeur : 10,
ajouter : function(inc){
this.value = (typeof inc === "number") inc : 1;
}
};
testObj.add();
testObj.value; // 11
testObj.add(2);
testObj.value; // 13
Il y a un problème avec l'écriture de cette façon. Il n'est pas garanti que la valeur ne soit pas modifiée illégalement. comme suit.
var testObj = (function(){
var value = 10;
return {
add: function(inc){
value = (typeof inc === "number") ? getValue : function (){
valeur de retour ;
testObj.add();
testObj.getValue(); // 11
testObj.add(2);
testObj.getValue(); // 13
Nous pouvons généralement appeler une fonction pour initialiser testObj La fonction renverra un objet littéral. La variable est définie ici, qui est toujours disponible pour les méthodes add et getValue, mais la portée de la fonction la rend invisible pour les autres programmes. Dans le même temps, nous pouvons également conclure que la fonction interne a un cycle de vie plus long que sa fonction externe.
Continuons à regarder un exemple d'appel de constructeur.
Copier le code
MyObj.prototype.getStatus = function(){
return this.status;
};
var obj = new MyObj("javascript");obj.getStatus(); // "javascript"
Il n'y a rien de mal à écrire ceci, mais ce sera un peu "inutile ", pourquoi ? Que diriez-vous d'utiliser une méthode getStatus pour accéder à une propriété accessible directement ? Bien entendu, cela n’a de sens que si le statut est une propriété privée.
Copier le code
}
};
};
var myObj = obj("javascript");
myObj.getStatus(); // "javascript"
Ici, lorsque nous appelons obj, il renvoie un nouvel objet contenant la méthode getStatus, un la référence à l'objet est stockée dans myObj Même si obj a été renvoyé, la méthode getStatus bénéficie toujours du privilège d'accéder à l'attribut status de l'objet obj. La méthode getStatus n'accède pas à une copie du paramètre, elle accède au paramètre lui-même. Ceci est possible car la fonction a accès au contexte dans lequel elle a été créée, ce que l'on appelle une fermeture.