Skip to content

Funções Anônimas e Arrow Functions

Funções anônimas e arrow functions são características poderosas do TypeScript e JavaScript, permitindo uma escrita de código mais concisa e expressiva. Entender as diferenças entre elas e seus usos pode ajudar a escrever código mais claro e eficiente.

Funções Anônimas

Funções anônimas são funções sem um nome. Elas são frequentemente usadas como argumentos para outras funções, ou atribuídas a variáveis.

Definição e Uso de Funções Anônimas:

Uma função anônima é definida sem um identificador e é geralmente usada em contextos onde a função é necessária apenas uma vez.

typescript
// Função anônima atribuída a uma variável
const add = function (x: number, y: number): number {
  return x + y;
};

console.log(add(2, 3)); // Saída: 5

// Função anônima como argumento de outra função
setTimeout(function () {
  console.log("Executed after 1 second");
}, 1000);

Funções anônimas são úteis quando você precisa definir uma função de maneira rápida e não pretende reutilizá-la em outro lugar.

Arrow Functions

Arrow functions, introduzidas no ES6, são uma forma mais curta de escrever funções anônimas. Elas utilizam a sintaxe => e têm uma série de diferenças e vantagens em relação às funções tradicionais.

Definição e Uso de Arrow Functions:

Arrow functions são mais concisas e herdam o contexto this do escopo onde foram definidas, o que pode evitar problemas comuns com a palavra-chave this em JavaScript.

typescript
// Arrow function atribuída a uma variável
const multiply = (x: number, y: number): number => {
  return x * y;
};

console.log(multiply(2, 3)); // Saída: 6

// Sintaxe ainda mais curta para funções que retornam uma expressão
const square = (x: number): number => x * x;

console.log(square(4)); // Saída: 16

// Arrow function como argumento de outra função
setTimeout(() => {
  console.log("Executed after 1 second");
}, 1000);

Diferenças Principais entre Funções Anônimas e Arrow Functions

  1. Sintaxe Mais Concisa:

    • Arrow functions são mais curtas e menos verbosas, especialmente úteis para funções curtas ou callbacks.
  2. Comportamento do this:

    • Uma das diferenças mais significativas é como o this é tratado. Nas funções tradicionais, this pode se referir a diferentes contextos dependendo de como a função é chamada. Em arrow functions, this é sempre léxico, ou seja, ele herda o valor de this do escopo onde a função foi definida.
    typescript
    function Person() {
      this.age = 0;
    
      // Função tradicional: `this` é reavaliado
      setInterval(function growUp() {
        this.age++;
        console.log(this.age); // `this` não se refere ao objeto `Person`
      }, 1000);
    }
    
    const p = new Person(); // Na prática, isso não funcionará como esperado
    
    function Person() {
      this.age = 0;
    
      // Arrow function: `this` é léxico
      setInterval(() => {
        this.age++;
        console.log(this.age); // `this` se refere corretamente ao objeto `Person`
      }, 1000);
    }
    
    const p = new Person(); // Isso funcionará como esperado
  3. Uso de Argumentos:

    • Em funções tradicionais, a palavra-chave arguments está disponível, representando todos os argumentos passados para a função. Em arrow functions, arguments não está disponível; para acessar argumentos, você precisa usar parâmetros rest (...args).
    typescript
    function traditionalFunction() {
      console.log(arguments);
    }
    
    traditionalFunction(1, 2, 3); // Saída: [1, 2, 3]
    
    const arrowFunction = (...args: number[]) => {
      console.log(args);
    };
    
    arrowFunction(1, 2, 3); // Saída: [1, 2, 3]
  4. Construtores:

    • Arrow functions não podem ser usadas como construtores e não têm a propriedade prototype.
    typescript
    const Foo = () => {};
    const foo = new Foo(); // Isso lançará um erro: Foo is not a constructor

Usos Comuns

  • Callbacks e Funções de Ordem Superior: Arrow functions são frequentemente usadas como callbacks ou em funções de ordem superior devido à sua sintaxe concisa e ao comportamento léxico de this.

    typescript
    const numbers = [1, 2, 3, 4, 5];
    const doubled = numbers.map((n) => n * 2);
    console.log(doubled); // Saída: [2, 4, 6, 8, 10]
  • Métodos em Classes: Em classes, as arrow functions são úteis para métodos que precisam acessar o contexto this da instância da classe.

    typescript
    class Timer {
      seconds: number = 0;
    
      start() {
        setInterval(() => {
          this.seconds++;
          console.log(this.seconds);
        }, 1000);
      }
    }
    
    const timer = new Timer();
    timer.start(); // Isso funcionará corretamente

Conclusão

Funções anônimas e arrow functions são ferramentas essenciais no TypeScript. Funções anônimas são úteis para definições rápidas e reutilizáveis, enquanto arrow functions oferecem uma sintaxe mais curta e comportamento mais previsível do this, tornando-as ideais para callbacks e métodos de classe. Entender quando e como usar cada uma pode levar a um código mais claro, conciso e eficiente.