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.
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