93 votes

référence de variable javascript / alias

est-il possible en javascript d'attribuer un alias / reference à un var local?

Je veux dire quelque chose comme C:

 function foo() {
  var x = 1;
  var y = &x;
  y++;
  alert(x); // prints 2 
}
 

= EDIT =

Est-il possible d'alias arguments.callee dans ce code ?:

 function foo() {
  arguments.callee.myStaticVar = arguments.callee.myStaticVar || 0;
  arguments.callee.myStaticVar++;
  return arguments.callee.myStaticVar;
}
 

173voto

Darin Dimitrov Points 528142

En javascript, les types primitifs tels que les entiers et les chaînes sont passés par valeur alors que les objets sont passés par référence. Donc, pour y parvenir, vous devez utiliser un objet:

 // declare an object with property x
var obj = { x: 1 };
var anotherObj = obj;
anotherObj.x++;
alert(obj.x); // displays 2
 

14voto

user187291 Points 28951

dans une certaine mesure, cela est possible, vous pouvez créer un alias pour une variable à l'aide de fermetures:

 Function.prototype.toString = function() {
    return this();
}

var x = 1;
var y = function() { return x }
x++;
alert(y()); // prints 2 
 

8voto

Justin Love Points 3073

Si vous pouvez alias quelque chose dépend du type de données. Les objets, les tableaux et les fonctions seront traitées par référence et l'aliasing est possible. Les autres types sont essentiellement atomique, et la variable stocke la valeur plutôt qu'une référence à une valeur.

les arguments.le destinataire de l'appel est une fonction, et donc vous pouvez avoir une référence et modifier cet objet partagé.

function foo() {
  var self = arguments.callee;
  self.myStaticVar = self.myStaticVar || 0;
  self.myStaticVar++;
  return self.myStaticVar;
}

Notez que si, dans le code ci-dessus vous dites self = function() {return 42;}; alors self serait alors référence à un autre objet que d' arguments.callee, ce qui reste une référence pour foo. Lorsque vous avez un objet composé, l'opérateur d'affectation remplace la référence, il ne change pas la visée de l'objet. Avec des valeurs atomiques, un cas comme celui - y++ est équivalent à y = y + 1, ce qui est de l'affectation d'un "nouveau" entier à la variable.

1voto

Tom Bartel Points 1995

modifier ma réponse précédente: si vous voulez compter les appels d'une fonction, vous pouvez essayer:

 var countMe = ( function() {
  var c = 0;

  return function() {
    c++;
    return c;
  }
})();

alert(countMe()); // Alerts "1"
alert(countMe()); // Alerts "2"
 

Ici, c sert de compteur et vous n'avez pas à utiliser arguments.callee.

1voto

J'ai cherché aujourd'hui mon projet et trouvé celui qui semble être le meilleur moyen de le faire: http://sirdarckcat.blogspot.com/2007/07/passing-reference-to-javascript.html

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