É possível em javascript atribuir um alias / referência a um var local de alguma forma?
Quero dizer algo como C:
function foo() {
var x = 1;
var y = &x;
y++;
alert(x); // prints 2
}
= EDITAR =
É possível criar um alias para argumentos.callee neste código ?:
function foo() {
arguments.callee.myStaticVar = arguments.callee.myStaticVar || 0;
arguments.callee.myStaticVar++;
return arguments.callee.myStaticVar;
}
javascript
gpilotino
fonte
fonte
Respostas:
Em JavaScript, os tipos primitivos, como inteiros e strings, são passados por valor, enquanto os objetos são passados por referência. Portanto, para conseguir isso, você precisa usar um objeto:
fonte
Até certo ponto, isso é possível, você pode criar um alias para uma variável usando fechamentos:
fonte
alert(y)
está certa. Embora redefinir os métodos de protótipo de Função seja um estilo muito ruim. Mas ei, funciona!Se você pode criar um alias para algo, depende do tipo de dados. Objetos, matrizes 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.
argumentos.callee é uma função e, portanto, você pode ter uma referência a ela e modificar esse objeto compartilhado.
Observe que se no código acima você dissesse,
self = function() {return 42;};
entãoself
se referiria a um objeto diferente dearguments.callee
, que permanece uma referência aofoo
. Quando você tem um objeto composto, o operador de atribuição substitui a referência, ele não altera o objeto referido. Com valores atômicos, um caso comoy++
é equivalente ay = y + 1
, que atribui um 'novo' inteiro à variável.fonte
arguments.callee
já tem um alias, que é o nome da função. Neste exemplo, você poderia apenas usarfoo.myStaticVar
(talvez não fosse o caso em 2009?)edite a minha resposta anterior: se quiser contar as invocações de uma função, você pode tentar:
Aqui, c serve como contador e você não precisa usar argumentos.callee.
fonte
countMe = function f(){ return ++f.c || (f.c = 1); }
Expandindo a postagem do user187291 , você também pode usar getters / setters para evitar o uso de funções.
fonte
em 2019 preciso escrever plugins jquery minificados então preciso também desse alias e então testando esses exemplos e outros, de outras fontes, encontrei um jeito sem copiar na memória do objeto inteiro, mas criando apenas uma referência. Eu testei isso já com o firefox e observando a memória da guia do gerenciador de tarefas no firefox antes. O código é:
fonte