referência de variável javascript / alias

É possível no javascript atribuir um alias / referência a um local var someway?

Eu quero dizer algo tipo C:

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

= EDIT =

É possível alias arguments.callee neste código ?:

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

Em JavaScript, tipos primitivos como inteiros e strings são passados ​​por valor, enquanto objects são passados ​​por referência. Então, para conseguir isso, você precisa usar um object:

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

Até certo ponto isso é possível, você pode criar um alias para uma variável usando closures:

 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 

Se você pode alias algo depende do tipo de dados. Objetos, arrays e funções serão tratados por referência e o aliasing é possível. Outros tipos são essencialmente atômicos e a variável armazena o valor em vez de uma referência a um valor.

arguments.callee é uma function e, portanto, você pode ter uma referência a ela e modificar esse object compartilhado.

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

Note que se no código acima você dissesse self = function() {return 42;}; então, self se referiria a um object diferente de arguments.callee , que permanece uma referência a foo . Quando você tem um object composto, o operador de atribuição substitui a referência, ele não altera o object referido. Com valores atômicos, um caso como y++ é equivalente a y = y + 1 , que está atribuindo um inteiro ‘novo’ à variável.

edite a minha resposta anterior: se você quiser contar as invocações de uma function, convém tentar:

 var countMe = ( function() { var c = 0; return function() { c++; return c; } })(); alert(countMe()); // Alerts "1" alert(countMe()); // Alerts "2" 

Aqui, c serve como contador e você não precisa usar arguments.callee.

Expandindo a postagem de user187291 , você também pode usar getters / setters para conseguir usar funções.

 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'