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.
function foo() {
var self = arguments.callee;
self.myStaticVar = self.myStaticVar || 0;
self.myStaticVar++;
return self.myStaticVar;
}
Observe que se no código acima você dissesse, self = function() {return 42;};
então self
se referiria a um objeto diferente de arguments.callee
, que permanece uma referência ao foo
. 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 como y++
é equivalente a y = y + 1
, que atribui um 'novo' inteiro à variável.