Est-il possible en javascript d'attribuer un alias / une référence à une variable locale?
Je veux dire quelque chose du genre C:
function foo() {
var x = 1;
var y = &x;
y++;
alert(x); // prints 2
}
= MODIFIER =
Est-il possible d'aliaser arguments.callee dans ce code?:
function foo() {
arguments.callee.myStaticVar = arguments.callee.myStaticVar || 0;
arguments.callee.myStaticVar++;
return arguments.callee.myStaticVar;
}
javascript
gpilotino
la source
la source
Réponses:
En JavaScript, les types primitifs tels que les entiers et les chaînes sont passés par valeur tandis que les objets sont passés par référence. Donc, pour y parvenir, vous devez utiliser un objet:
la source
Dans une certaine mesure, cela est possible, vous pouvez créer un alias vers une variable à l'aide de fermetures:
la source
alert(y)
raison. Bien que redéfinir les méthodes des prototypes de fonction soit un très mauvais style. Mais bon, ça marche!La possibilité de créer un alias dépend du type de données. Les objets, tableaux et fonctions seront gérés par référence et l'alias est possible. Les autres types sont essentiellement atomiques et la variable stocke la valeur plutôt qu'une référence à une valeur.
arguments.callee est une fonction, et vous pouvez donc y faire référence et modifier cet objet partagé.
Notez que si dans le code ci-dessus vous deviez dire,
self = function() {return 42;};
alorsself
ferait référence à un objet différent dearguments.callee
, qui reste une référence àfoo
. Lorsque vous avez un objet composé, l'opérateur d'affectation remplace la référence, il ne modifie pas l'objet référencé. Avec les valeurs atomiques, un cas commey++
est équivalent ày = y + 1
, qui assigne un «nouvel» entier à la variable.la source
arguments.callee
déjà un alias, qui est le nom de la fonction. Dans cet exemple, vous pouvez simplement utiliserfoo.myStaticVar
(peut-être que ce n'était pas le cas en 2009?)modifier à ma réponse précédente: si vous souhaitez compter les appels d'une fonction, vous pouvez essayer:
Ici, c sert de compteur, et vous n'avez pas besoin d'utiliser arguments.callee.
la source
countMe = function f(){ return ++f.c || (f.c = 1); }
En développant le message de user187291 , vous pouvez également utiliser des getters / setters pour éviter d'utiliser des fonctions.
la source
en 2019, j'ai besoin d'écrire des plugins jquery minifiés, donc j'en ai besoin aussi cet alias et donc en testant ces exemples et d'autres, à partir d'autres sources, j'ai trouvé un moyen sans copie dans la mémoire de l'objet entier, mais en ne créant qu'une référence. J'ai déjà testé cela avec Firefox et en regardant la mémoire des onglets du gestionnaire de tâches sur Firefox avant. Le code est:
la source