“A view of the airplane aisle with a flight attendant carrying a tray” by Suhyeon Choi on Unsplash

JavaScript: Funções de primeira classe

Bruno C. Couto
3 min readJul 2, 2018

O que significa o termo “funções de primeira classe”? JavaScript é uma linguagem com suporte a funções de primeira classe? E o que essa característica significa em aplicações reais?

O que significa uma linguagem ter suporte a “funções de primeira classe”?

Uma linguagem de programação é dita ter suporte a “funções de primeira classe” se essa linguagem trata as funções como “cidadãs de primeira classe”.

E o que significa funções como cidadãs de primeira classe?

Significa que as funções são tratadas como qualquer outro tipo de dado: elas podem ser armazenadas em variáveis, passadas como parâmetros e retornadas por outras funções.

Em linguagens de programação puramente funcionais, essa característica é essencial, uma vez que todo o ecossistema da linguagem é baseado no uso de funções.

Apesar de não ser uma linguagem puramente funcional, JavaScript possui suporte a funções de primeira classe, e a utilizaremos para a demonstração dos nossos exemplos.

Funções como cidadãs de primeira classe

Vamos ver agora alguns exemplos práticos do uso de funções como cidadãs de primeira classe em JavaScript.

Neste primeiro exemplo temos uma função sendo armazenada em uma variável. Logo depois essa variável é executada como se fosse a própria função. Veja:

function sayHello() {
console.log("Hello");
}
// Armazena a função 'sayHello' em 'funcRef'
const funcRef = sayHello;
// Executa 'funcRef'
funcRef();

Atenção: observe que estamos passando a referência da função sayHello para funcRef sem a utilização de parêntese. Se utilizássemos o parêntese como em: sayHello() , estaríamos na verdade atribuindo o valor de retorno da função sayHello à variável funcRef , que seria undefined nesse exemplo.

No próximo exemplo temos uma função sendo passada como parâmetro para outra função, que executa a função recebida, veja:

function execute(fn) {
// Executa a função recebida no parâmetro 'fn'
fn();
}
function sayHello() {
console.log("Hello world!");
}
// A função 'sayHello' é passada como parâmetro
execute(sayHello);

Repare que, assim como no exemplo anterior, nós estamos trabalhando com a referência da função, sem utilizar o parêntese quando a passamos como parâmetro.

Agora, neste último exemplo, temos uma função sendo retornada por outra função. Essa característica nos proporciona muita flexibilidade na construção de comportamentos dinâmicos, veja:

function chooseHello(isNight) {
if (isNight) {
return silentHello; // Retorna a função 'silentHello'
} else {
return noisyHello; // Retorna a função 'noisyHello'
}
}
function silentHello() {
console.log("hello world");
}
function noisyHello() {
console.log("HELLOOOO WORLD!!!");
}
// sayHello recebe a função retornada por 'chooseHello'
const sayHello = chooseHello(false); // #Linha 18
sayHello(); // HELLOOOO WORLD!!! // #Linha 20

Nesse exemplo, nós utilizamos a flexibilidade de podermos retornar uma função por outra função para construir um comportamento dinâmico. A função chooseHello utiliza seu parâmetro isNight para decidir se retorna a função silentHello ou noiseHello.

Na linha 18, atribuímos à variável sayHello o retorna da função chooseHello. E na linha 20, executamos a função sayHello.

Resumindo

Funções como cidadãs de primeira classe é um recurso incrível de linguagens funcionais.

JavaScript, apesar de não ser puramente funcional, possui esse recurso. E nós devemos sempre utilizá-lo para deixar nosso código eficiente, limpo e reutilizável.

Em um único artigo seria praticamente impossível citar todos os benefícios e vantagens que obtemos através da utilização das funções como cidadãs de primeira classe. Padrões como “higher-order functions” com certeza merecem artigos exclusivos.

Mas o que aprendemos até aqui é que funções são extremamente poderosas, e se as utilizarmos de forma correta, seguindo padrões e boas práticas, nossos códigos serão muito mais profissionais e eficientes.

Até o próximo!

Muito obrigado por ler esse texto até o final. Espero que você tenha gostado e que ele possa ter te ajudado de alguma forma.

E se você gostou, não esqueça de deixar seus “claps” e compartilhar esse texto com seus amigos. Me siga no twitter e aqui no medium, que estarei sempre buscando postar conteúdos interessantes. Até o próximo!

Referências

--

--