Arguments em arrow functions

Uma das grandes vantagens do poder js é a flexibilidade e a liberdade que essa linguagem fornece para o desenvolvedor web.

Inclusive, recentemente (nem tanto mais) houve uma das maiores features da linguagem (ES6/ES2015), muitos recursos maneiros foram adicionados, segue um resuminho básico aqui.

Vamos ao caso

Poucas vezes precisei recuperar os argumentos de função desconsiderando os parâmetros e utilizando a variável local “arguments”, mas dessa vez eu precisava disso e algo deu errado. Como tenho o costume de usar sem moderação arrow functions fui pego de surpresa!

Abaixo vou exibir um exemplo do que eu queria fazer:


const fnA = () => {    
    let args = Array.from(arguments);
    console.log(args);    
    //ERROR: arguments is not defined!  
};

Como assim? Não tenho mais acesso a arguments! Numa busca rápida me informo que para escopo de arrow functions o contexto interno “arguments” não existe mais. :(

Implementando com tradicional “function” funciona normalmente:


const fnB = function(){        
    let args = Array.from(arguments);
    console.log(args);    
    //OK
};

Aí, me restou utilizar um carinha que eu já tinha visto em códigos, mas nunca havia aplicado.

Rest parameter

Também um recurso recente do es6, rest parameter dispensa utilizar a variável interna “arguments” mas força o uso de “…” em um parâmetro na função. Mais detalhes aqui

O legal é que esse recurso deixa o código com uma legibilidade melhor.

Abaixo exemplo:


const fnC = (...args) => {        
    console.log(args);    
    //OK    
};

//Combinando com parâmetros

const fnD = (p1, p2, ...args) => {        
    console.log(p1); 
    console.log(p2); 
    console.log(args);    
};

//Chamadas

fnA("o/", 12, 30); //error (arguments is not defined)
fnB("o/", 12, 30); // ["o/", 12, 30]
fnC("o/", 12, 30); // ["o/", 12, 30]
fnD("o/", 12, 30); // o/,12,[30]


Bacana!

Só um adendo para o conceito “…” no js, tem esse carinha aqui “spread operator”, que é utilizado como um auxiliar de variáveis expandido os valores para array, maiores detalhes aqui.