Tem casos em que tanto faz, mas há algumas diferenças.
Primeiramente, vale notar que no primeiro caso vc declarou uma função usando function
, e no segundo vc criou uma arrow function (a sintaxe (argumentos) => { etc }
). Só isso já faz com que não sejam iguais, pois há várias diferenças entre arrow functions e funções definidas com function
: veja aqui e aqui para mais detalhes.
Dito isso, mesmo que vc usasse function expression em vez de uma arrow function:
const somar = function (n1, n2) {
return n1 + n2;
}
Ainda sim seria diferente.
Por exemplo, sabia que isso aqui funciona?
console.log(somar(1, 2)); // 3
function somar(n1, n2) {
return n1 + n2;
}
Pois é, eu posso chamar uma função antes dela ser definida. Isso acontece por causa do hoisting, que é basicamente um mecanismo que move as declarações de funções (entre outras coisas, veja o link) para o topo do escopo, antes do código ser executado.
Porém, com arrow function ou com function expression não funciona:
console.log(somar(1, 2)); // erro!
const somar = function (n1, n2) {
return n1 + n2;
}
console.log(somar(1, 2)); // erro!
const somar = (n1, n2) => {
return n1 + n2;
}
Ambos os códigos acima dão erro. No Chrome, a mensagem foi:
Uncaught ReferenceError: somar is not defined
E no Node foi:
ReferenceError: Cannot access 'somar' before initialization
Isso porque o que temos aqui é uma declaração de variável (const somar
), cujo valor é a função anônima. Mas como estamos tentando usá-la antes da atribuição, dá erro.
Para mais detalhes, veja aqui, aqui e aqui.
Outra diferença é que uma função "normal" pode ser "re-declarada":
function somar(n1, n2) {
return n1 + n2;
}
function somar(n1, n2) {
return n1 - n2;
}
console.log(somar(1, 2)); // -1
Ou seja, o que acaba valendo é a última versão dela, por isso o código acima imprime -1
em vez de 3
.
Agora se eu fizer isso:
const somar = function (n1, n2) {
return n1 + n2;
}
somar = function (n1, n2) {
return n1 - n2;
}
console.log(somar(1, 2));
Aí dá erro na segunda atribuição:
TypeError: Assignment to constant variable
Isso porque a variável foi declarada como const
, ou seja, não posso atribuir um novo valor a ela. Claro que se ela tivesse sido declarada com var
ou let
, aí seria possível alterá-la, mas enfim, esta é outra diferença (e este comportamento seria o mesmo se eu usasse arrow function).
Obrigado pela explicação! Eu tenho uma dúvida referente a isso e acredito que você possa responder. Você precisa criar uma função de soma (igual a que você viu que eu fiz), de que forma você criaria, e por quê?
Tipo, se tivesse que usar a função mais de uma vez, criaria com function expression, ou não?
E se tivesse que usar ela somente uma vez, criaria com arrow function?