Tipos de declarações de funções em Javascript

Hey There 👏

Hoje venho compartilhar algo simples, que é, como podemos declarar funções em javascript e como as mesmas são denominadas.

Um termo muito utilizado no mundo JS é o Higher Order Function que tem como tradução literal Função de Ordem Superior, isso significa que funções são tratadas como dados em javascript, sendo as mesmas utilizadas em paramêtro, retornos e até mesmo em variáveis.

Bem, que tal aprendermos alguns termos utilizados na criação de funções?

Function Declaration 👾

function square() {}

Function Expression 👽

const square = function() {}

Named Function Expression 🤖

const square = function square() {}

Arrow Function 🐧

const square = () => {}

Obs: Lembrando que Arrow Function pode aprensentar um comportamento diferente das demais funções, pricinpalmente no que diz repeito ao uso do this.

É algo simples, mas que costuma sair em provas ou questionários. Espero ter ajudado! 🤝

Github: https://github.com/ericneves Linkedin: https://linkedin.com/in/ericnevesrr

Vale lembrar que tem algumas diferenças entre eles.

Por exemplo, uma function declaration pode aparecer depois que esta é chamada, e funciona normalmente devido a um processo chamado hoisting (basicamente, é como se o interpretador "movesse" algumas declarações para o topo). Exemplo:

f(); // olá

function f() {
    console.log('olá');
}

Apesar de estar chamando a função antes da sua declaração, o código acima funciona normalmente (devido ao hoisting, a declaração é avaliada antes).

Mas function expressions não sofrem os efeitos do hoisting, então assim já não funciona:

f(); // TypeError: f is not a function

var f = function () {
    console.log('olá');
}

Mesmo se eu usasse uma named function expression (var f = function f() { etc), também daria o mesmo erro. E com arrow function, também não funcionaria, pois para estas também não é feito o hoisting.


E tem ainda um outro tipo (se bem que podemos considerar um "sub-tipo"), que é o IIFE (Immediately Invoked Function Expression), quando você declara a função e já a executa:

(function (texto) {
    console.log('olá', texto);
})('mundo'); // olá mundo

Por fim, sobre as diferenças entre function e arrow functions, não deixe de ler a documentação.

Faltou a forma **IIFE**, obrigado por ressaltar isso e em relação ao hosting também, parabéns pelo comentário 👾

Só complementando:

arrow functions "herdam" o this do contexto mais próximo. Mas nao declaram um contexto próprio.

Ex:

class A {
   methodA() { } 

   methodB() {
      const b = () => this.methodA()
   }
}

functions contém um this próprio, ou seja, um contexto.

Quando uma function é chamada diretamente (foo()) o this dela é undefined.

Se uma function é instanciada (new foo()) o this vai ser a instancia da function (da msm forma que acontece com classes).

Ex:

class A {
   methodA() { } 

   methodB() {
      const b = function() {
        this.methodA(); // vai dar erro pq this é undefined
      } 
      
      const a = new (function ()
   }
}

Function e arrow function são duas coisas diferentes. Muita gente confunde isso, pensando que são apenas formas diferente de declarar uma função

Correto, muito boa observação, massa demais seu comentário 🛸
Lembrando que arrow funcions também precisam ser declaradas antes de serem usadas. Eu gosto muito de usar arrow functions pra fazer callbacks junto com o jQuery. ```javascript $('#meu-seletor').on('click', () => { // Lógica do onlclick }) ``` Mas como o colega mencionou, se eu precisar do this, tenho que usar uma function normal. ```javascript $('#meu-seletor').on('click', function() { // Aqui eu tenho o this, referente ao objetor que gerou evento }) ```