Junior
Qual é a diferença entre funções de seta e funções normais em JavaScript?
sobes.tech IA
Resposta da IA
- Sintaxe:
- Função normal:
function myFunction() { ... } - Função seta:
() => { ... }ouparam => { ... }
- Função normal:
- Contexto
this:- Função normal:
thisé determinado pelo contexto de chamada. - Função seta:
thisé herdado lexicalmente do escopo circundante (não tem seu própriothis).
- Função normal:
- Construtores:
- Função normal: Pode ser usada como construtor (
new myFunction()). - Função seta: Não pode ser usada como construtor.
- Função normal: Pode ser usada como construtor (
- Objeto
arguments:- Função normal: Possui seu próprio objeto
argumentscontendo os argumentos passados. - Função seta: Não possui seu próprio objeto
arguments, o acesso aos argumentos é feito através de parâmetros rest (...args).
- Função normal: Possui seu próprio objeto
- Funções nomeadas:
- Função normal: Pode ser nomeada (
function myFunction() { ... }). - Função seta: Por padrão anônima, atribuída a uma variável para nomear (
const myFunction = () => { ... }).
- Função normal: Pode ser nomeada (
- Retorno implícito:
- Função normal: Requer explicitamente
returnpara retornar um valor (exceto em casos simples como IIFE). - Função seta: Em corpo de uma única linha, pode retornar implicitamente o resultado de uma expressão sem
return.
- Função normal: Requer explicitamente
Tabela comparativa:
| Característica | Função normal | Função seta |
|---|---|---|
| Sintaxe | function name() { ... } |
() => { ... } |
Contexto this |
Dinâmico (segundo a chamada) | Léxico (do escopo pai) |
| Construtor | Sim | Não |
Objeto arguments |
Sim | Não (usa parâmetros rest) |
| Nomeação | Pode ser nomeada | Anônima (atribui-se) |
| Retorno implícito | Não (normalmente requer return) |
Sim (para corpo de uma linha) |
// Exemplo de funções normais
function standardFunction() {
console.log(this); // Depende do contexto de chamada
console.log(arguments); // Objeto arguments disponível
}
const obj = {
method: standardFunction
};
standardFunction(); // `this` será window (no navegador) ou undefined (modo estrito)
obj.method(); // `this` será obj
new standardFunction(); // `this` será a nova instância
// Exemplo de funções seta
const arrowFunction = () => {
console.log(this); // Herda `this` do escopo circundante (por exemplo, Global ou módulo)
// console.log(arguments); // Erro, `arguments` não disponível
};
const outerObj = {
outerMethod: function() {
const innerArrowFunction = () => {
console.log(this); // Herda `this` de outerMethod (que é outerObj)
};
innerArrowFunction();
}
};
arrowFunction(); // `this` será window (no navegador) ou {} (em Node.js)
outerObj.outerMethod(); // `this` dentro de innerArrowFunction será outerObj
// Retorno implícito em função seta
const sum = (a, b) => a + b;
console.log(sum(2, 3)); // 5
// Função normal com retorno explícito
function multiply(a, b) {
return a * b;
}
console.log(multiply(2, 3)); // 6
// A função seta não pode ser construtora
// new arrowFunction(); // Erro: TypeError: arrowFunction_1 não é um construtor