Fundamentos do JavaScript: o que são e como funcionam as funções

Por Sérgio Oliveira | 17.12.2014 às 10:40

O JavaScript é, sem dúvidas, uma das linguagens de programação mais populares e mais fáceis de se aprender. Sua sintaxe direta e objetividade atraem desenvolvedores de todos os segmentos, que cada vez mais a procuram para enriquecer seu website ou app web.

Engana-se, no entanto, quem acredita que o JavaScript é uma linguagem simples e desprovida de recursos. Para desmistificar esse tipo de pensamento, hoje abordaremos as funções, que são uma parte fundamental no desenvolvimento em JavaScript. Com elas nós podemos tornar nosso código não linear, organizar e torná-lo mais fácil de compreender.

Definindo uma função

Antes de usarmos uma função, nós precisamos criá-la. Apesar disso, o JavaScript já conta com uma tonelada de funções embutidas que já podemos usar diretamente no nosso código. Mesmo assim, para efeitos didáticos, na matéria de hoje vamos começar aprendendo a definir uma função.

Há duas formas de declarar uma função em JavaScript: o formato padrão de declaração e a atribuição de uma expressão de função a uma variável ou propriedade:

Declaração de funções em JavaScript

Há uma certa discussão sobre qual a forma correta de declarar funções aqui, mas a verdade é que no fundo ambas as formas têm o mesmo propósito e a discussão acaba entrando no campo das preferências de cada um.

Por exemplo, há quem diga que, já que JavaScript é inspirado em C, as funções devem ser declaradas da maneira clássica. Os contemporâneos, por outro lado, acreditam que as funções devem ser tratadas como qualquer outra variável e portanto devem ser declaradas como tal. Um terceiro grupo acredita que por a segunda forma ser a correta para atribuir uma função a uma propriedade de um objeto, então é ela que deve ser usada.

Logo, fica claro que, no fim das contas, tudo não passa da preferência de cada um.

Funções são objetos

Já que falamos em objetos e propriedades, algo que precisa ficar claro é que, diferente da maioria das linguagens de programação, no JavaScript as funções são objetos.

Isso pode soar estranho e até causar uma certa confusão, mas a verdade é que as funções podem inclusive ter propriedades. A bem da verdade, algumas propriedades já são atribuídas a elas quando você as cria. Esquisito, não é mesmo?

Forma de atribuir uma propriedade a uma função

Apesar dessa versatilidade, nós não podemos atribuir um objeto inteiro a uma função, mas podemos atribui-lo a uma propriedade dela.

Chamando uma função

Agora que já sabemos como criar uma função, é hora de aprender a usá-la. Por incrível que pareça, essa pode ser a parte mais complexa de se aprender a usar funções em JavaScript.

São inúmeras as formas de se chamar esses blocos de instruções e, embora você possa resolver tudo com o feijão e arroz tradicional, é possível que se perca em códigos mais avançados.

Feijão com arroz

Vamos começar com a forma padrão de se chamar uma função. Aqui, tudo o que é preciso fazer é adicionar os parênteses após o nome da função e, talvez, alguns argumentos dentro desses parênteses:

Forma padrão de chamar uma função JavaScript

Uma das coisas mais interessantes aqui é que não importa a quantidade de parâmetros que você passe para uma função JavaScript, ele nunca retornará um erro para você. Dessa forma, é possível criar funções com parâmetros "opcionais" que podem ser passados ou não dependendo da sua necessidade.

Essa versatilidade, no entanto, também tem seu lado ruim e pode exigir que você verifique mais de uma vez para garantir que está passando os parâmetros corretos antes de partir para uma análise mais aprofundada do seu código para descobrir onde está aquele erro que insiste em acontecer. Para evitar desperdiçar tempo com isso, o ideal mesmo é que você documente todo o seu código e descreva desde o número de argumentos das suas funções até o tipo de cada um deles.

Outro ponto curioso é que você também pode não definir nenhum argumento na assinatura da função se quiser. Essa prática, no entanto, não impede que você acesse quaisquer argumentos através da função "arguments" do JavaScript:

É possível definir funções sem nenhum argumento e mesmo assim manipulá-los

O "arguments" é uma estrutura especial semelhante a um vetor que, nesse caso em específico, armazena os parâmetros passados para uma função mesmo que ela não os possua em sua assinatura.

Contudo, ao contrário de um vetor, não é possível acessar seus valores como tradicionalmente fazemos a não ser que o convertamos para um array de fato. Veja o exemplo:

Para acessar os argumentos em uma função que não os possui em sua assinatura basta usar a função arguments

Dessa forma você poderia, por exemplo, acessar o segundo argumento da função usando args[1], o quarto usando args[3] e assim por diante.

Usando um construtor de função

Quem já está familiarizado com programação orientada a objetos com certeza está cansado de usar a palavra-chave "new" para criar objetos. Aqui, no JavaScript, essa palavra-chave ganha uma nova utilidade e também pode ser utilizada para chamar uma função.

Contudo, ao contrário do método normal visto anteriormente, ao usar o construtor new você não só chama a função, como também cria um novo objeto - lembra que funções são objetos no JavaScript?

Confira no exemplo abaixo:

Também é possível usar o método construtor new para chamar uma função

Para os iniciantes, essa forma de invocar uma função pode parecer estranha, mas voltaremos a discuti-la na próxima matéria quando falaremos de objetos. Portanto, não se desespere!

Usando a função "call"

Lembra-se que dissemos que há propriedades que são atribuídas automaticamente quando criamos uma função? Uma delas é a "call".

Ela é especialmente importante quando queremos invocar funções de diferentes contextos e queremos controlá-los dinamicamente. Veja o exemplo abaixo:

Outra forma de chamar funções em JavaScript é utilizando o método call que vem embutido em cada uma delas

Dominando o uso dessa função você poderá usar qualquer função como se ela fosse parte de qualquer objeto mesmo que ele tenha sido definido de uma maneira completamente a parte.

Outras formas de chamar funções

Essas são as formas mais básicas de se invocar uma função quando se está programando em JavaScript, mas existe uma porção de outras maneiras que são mais complexas e fariam essa série de matérias perder seu propósito por entrarmos em um campo mais avançado.

De toda forma, se você estiver curioso, vale a pena conferir a página da rede de desenvolvedores da Mozilla destinada especialmente às funções JavaScript. O artigo está em inglês, mas traz outros exemplos dos tópicos abordados aqui, bem como um debate sobre as diferentes formas de se definir uma função, definição condicional, funções aninhadas e uma porção de outras coisas.

Há muito o que se aprender sobre JavaScript e funções devido a sua flexibilidade e versatilidade. Agora que você já conhece um pouco sobre as duas coisas, a próxima matéria abordará objetos.