2009-11-06 19 views
84

¿Es posible en javascript asignar un alias/referencia a una var local de alguna manera?javascript referencia de variable/alias

me refiero a algo parecido a C:

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

= edit =

¿Es posible alias arguments.callee en este código ?:

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

Respuesta simple es no. Pero tengo la sensación de que alguien en SO vendrá con un truco para hacer esto :) – Amarghosh

Respuesta

161

en JavaScript, tipos primitivos como los enteros y las cadenas se pasan por valor mientras que los objetos se pasan por referencia. Así que con el fin de lograr esto es necesario utilizar un objeto:

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

que fue rápido =) Quiero hacer un alias para arguments.callee dentro de mi función (solo para evitar escribir arguments.callee cada vez) . ¿Es esto posible con este método? Si lo entiendo, puedo alias "argumentos", pero todavía tengo que escribir "callee" de todos modos, ¿no? – gpilotino

+0

¿podría publicar su código? –

+0

publicado. Acepto esta respuesta ya que mi pregunta era demasiado genérica. – gpilotino

1

edición en mi respuesta anterior: si desea contar invocaciones de una función, es posible que desee probar:

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

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

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

Aquí, c sirve como contador, y no tiene que usar arguments.callee.

+0

o puede usar una variable estática 'countMe = function f() { return ++ f.c || (f.c = 1); } ' – aljgom

12

Hasta cierto punto esto es posible, puede crear un alias para una variable mediante cierres:

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

var x = 1; 
var y = function() { return x } 
x++; 
alert(y); // prints 2, no need for() because of toString redefinition 
+1

Creo "alerta (y); // imprime 2" debería ser: "alerta (y()); // imprime 2" Tienes que llamar realmente la función de obtener el resultado Es una lástima, ya que la sintaxis sugerida sería útil en ciertas situaciones. –

+2

Esa redefinición toString está ahí por una razón, por lo que 'alert (y)' es realmente correcto. Aunque la redefinición de los métodos del prototipo Function es un estilo muy malo. Pero bueno, ¡funciona! – metalim

7

sea que usted puede crear un alias algo depende del tipo de datos. Los objetos, matrices y funciones se manejarán por referencia y es posible crear alias. Otros tipos son esencialmente atómicos, y la variable almacena el valor en lugar de una referencia a un valor.

arguments.callee es una función y, por lo tanto, puede tener una referencia y modificar ese objeto compartido.

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

Tenga en cuenta que si en el código anterior se va a decir a continuación self = function() {return 42;};self continuación, se referiría a un objeto diferente que arguments.callee, que sigue siendo una referencia a foo. Cuando tiene un objeto compuesto, el operador de asignación reemplaza la referencia, no cambia el objeto referido. Con valores atómicos, un caso como y++ es equivalente a y = y + 1, que asigna un 'nuevo' entero a la variable.

+0

gracias, eso es lo que necesitaba saber. – gpilotino

+0

sin mencionar que 'arguments.callee' ya tiene un alias, que es el nombre de la función. En este ejemplo, puede usar 'foo.myStaticVar' (¿quizás este no fue el caso en 2009?) – aljgom

0

busqué hoy para mi proyecto y encontramos este que parece ser la mejor manera de hacerlo: http://sirdarckcat.blogspot.com/2007/07/passing-reference-to-javascript.html

+4

Considere mejorar su publicación ya que su respuesta es esencialmente un enlace. Ver: [¿Las respuestas que solo contienen enlaces en otros sitios son realmente "buenas respuestas"?] (Http://meta.stackexchange.com/q/8231/156620) y [¿Por qué los enlaces son malos?] (Http: //meta.stackexchange) .com/q/7515/156620) –

1

Ampliando user187291's post, también se puede usar getters/setters de conseguir alrededor de tener que utilizar las funciones.

var x = 1; 
var ref = { 
    get x() { return x; }, 
    set x(v) { x = v; } 
}; 
(ref.x)++; 
console.log(x); // prints '2' 
x--; 
console.log(ref.x); // prints '1' 
Cuestiones relacionadas