¿Es posible en javascript asignar un alias / referencia a una var local de alguna manera?
Me refiero a algo parecido a C:
function foo() {
var x = 1;
var y = &x;
y++;
alert(x); // prints 2
}
= EDITAR =
¿Es posible asignar un alias a argumentos.callee en este código ?:
function foo() {
arguments.callee.myStaticVar = arguments.callee.myStaticVar || 0;
arguments.callee.myStaticVar++;
return arguments.callee.myStaticVar;
}
javascript
gpilotino
fuente
fuente
Respuestas:
En JavaScript, los tipos primitivos, como los números enteros y las cadenas, se pasan por valor, mientras que los objetos se pasan por referencia. Entonces, para lograr esto, necesita usar un objeto:
fuente
Hasta cierto punto, esto es posible, puede crear un alias para una variable usando cierres:
fuente
alert(y)
que en realidad es correcta. Aunque redefinir los métodos de prototipos de funciones es de muy mal estilo. Pero bueno, ¡funciona!Si puede alias algo depende del tipo de datos. Los objetos, matrices y funciones se manejarán por referencia y es posible crear un alias. Otros tipos son esencialmente atómicos y la variable almacena el valor en lugar de una referencia a un valor.
argumentos.callee es una función y, por lo tanto, puede tener una referencia a ella y modificar ese objeto compartido.
Tenga en cuenta que si en el código anterior dijera que
self = function() {return 42;};
entoncesself
se referiría a un objeto diferente aarguments.callee
, que sigue siendo una referencia afoo
. Cuando tiene un objeto compuesto, el operador de asignación reemplaza la referencia, no cambia el objeto referido. Con valores atómicos, un caso comoy++
es equivalente ay = y + 1
, que está asignando un 'nuevo' entero a la variable.fuente
arguments.callee
ya tiene un alias, que es el nombre de la función. En este ejemplo, podría usarfoo.myStaticVar
(¿tal vez este no era el caso en 2009?)editar a mi respuesta anterior: si desea contar las invocaciones de una función, es posible que desee probar:
Aquí, c sirve como contador y no es necesario utilizar argumentos.
fuente
countMe = function f(){ return ++f.c || (f.c = 1); }
Ampliando la publicación de user187291 , también puede usar getters / setters para evitar tener que usar funciones.
fuente
en 2019 necesito escribir complementos de jquery minificados, así que también lo necesito con este alias y, por lo tanto, probando estos ejemplos y otros, de otras fuentes, encontré una forma sin copiar en la memoria de todo el objeto, pero creando solo una referencia. Ya probé esto con Firefox y viendo la memoria de la pestaña del administrador de tareas en Firefox antes. El codigo es:
fuente