Je recherche des fonctionnalités de getters et setters mais je ne peux pas encore compter sur __defineGetter__ et __defineSetter__. Alors, comment peut-on maintenir la valeur d'une variable de fonction entre les appels de fonction?

J'ai essayé l'évidence, mais myvar est toujours indéfini au début de la fonction:

FNS.itemCache = function(val) {
    var myvar;
    if( !$.isArray(myvar)
        myvar = [];
    if( val === undefined)
        return myvar;
    .. // Other stuff that copies the array elements from one to another without
       // recreating the array itself.
};

Je pourrais toujours mettre un autre FNS._itemCache = [] juste au-dessus de la fonction, mais existe-t-il un moyen d'encapsuler les valeurs dans la fonction entre les appels?

2
Zachary Scott 2 oct. 2011 à 12:49

3 réponses

Meilleure réponse

Une autre façon de définir une variable privée consiste à encapsuler la définition de la fonction dans une fonction anonyme:

(function(){
    var myvar;
    FNS.itemCache = function(val) {
        if( !$.isArray(myvar))
            myvar = [];
        if( typeof val == "undefined")
            return myvar;
        .. // Other stuff that copies the array elements from one to another without
           // recreating the array itself.
    };
})();

De cette façon, myvar est défini dans la portée de FNS.itemCache. En raison de l'encapsuleur de fonction anonyme, la variable ne peut pas être modifiée ailleurs.

4
Rob W 2 oct. 2011 à 08:58

Vous pouvez stocker la valeur sur la fonction en utilisant arguments.callee comme référence à la fonction actuelle:

FNS.itemCache = function(val) {
    if( !$.isArray(arguments.callee._val)
        arguments.callee._val = [];
    if(val === undefined)
        return arguments.callee._val;
    .. // Other stuff that copies the array elements from one to another without
       // recreating the array itself.
};

Cependant, cela se cassera si la fonction est stockée dans un prototype et donc utilisée par plus d'un objet. Dans ce cas, vous devez utiliser une variable membre (par exemple this._val).

4
ThiefMaster 2 oct. 2011 à 08:52

C'est un modèle standard pour créer votre variable statique et pour créer des membres privés d'un objet

FNS.itemCache = (function() {
  var myvar;
  if( !$.isArray(myvar)
      myvar = [];
  return function(val) {
      if( val === undefined)
          return myvar;
         .. // Other stuff that copies the array elements from one to another without
         // recreating the array itself.
  }
})();
4
karnyj 2 oct. 2011 à 09:01