Truques com arguments em javascript

Erich Oliveira
2 min readOct 6, 2015

Muitos iniciantes no mundo do js não sabem, mas dentro do escopo de toda função existe uma variável chamada arguments que contém algumas informações sobre aquela execução. Basicamente, essa função indexa todos os argumentos passados como parâmetro para aquela função, então por exemplo:

var minhaFuncao = function(a){
console.log(arguments[0]);
console.log(a);
console.log(arguments[1]);
};

Ao ser executada como:

minhaFuncao('foo');
//imprime
foo
foo
undefined

Ou seja, arguments[0] é o primeiro argumento ('foo'), e arguments[1] é o segundo argumento, como nenhum foi passado, imprime 'undefined'.

Se está função fosse executada como:

minhaFuncao('foo','bar');
//imprime
foo
foo
bar

Veja que agora ela imprime o segundo argumento, mesmo ele não tendo sido declarado. Esse comportamento torna muito fácil instrumentar funções já que você sempre pode ler quais são os argumentos sendo passados (pense numa função que é um proxy para outra função).

Uma outra coisa importante é que 'arguments' não é um array, ele é um objeto que indexa utilizando números como chave, porém existe um truque muito simples para transformá-lo em array caso você precise:

function outraFuncao() {
var argumentsArray = Array.prototype.slice.call(arguments);
}

Uma outra coisa interessante sobre o 'arguments' é que ele possui uma propriedade chamada callee, que é um wrapper para a própria função, ele foi criado, porque nos primórdios do javascript não existiam funções nomeadas, e essa era uma forma de referenciar a própria função, esta propriedade já está deprecated, mas continua disponível para a gente, então como sempre gosto de fazer aqui, vou ensinar um pequeno hack usando ela.

function foo(){
console.log(arguments.callee.caller.name);
}
function bar(){
foo();
}
bar();

Alguma ideia do que será impresso na tela???

Se você disse bar , acertou. arguments.callee.caller é sempre uma referência pra função que chamou nossa função atual, e a propriedade name é o próprio nome de uma função (toda função nomeada possui essa propriedade).

Essa foi uma dica rápida. Espero que tenham gostado e aprendido um pouco mais sobre o mundo doido do javascript.

--

--