closures scope

Módulo 1: Funções Avançadas e Closures

Aula 1
1

Introdução a Closures e Escopo

8:30

Entendendo os fundamentos do escopo em JavaScript e como as closures funcionam

2

Entendendo o Escopo em JavaScript

Explicação detalhada de escopo global, de função e de bloco em JavaScript

Entendendo o Escopo em JavaScript

JavaScript tem vários tipos de escopo que determinam onde as variáveis podem ser acessadas em seu código. Entender o escopo é crucial para escrever um JavaScript limpo e de fácil manutenção.

Tipos de Escopo

1. Escopo Global

Variáveis declaradas fora de qualquer função ou bloco têm escopo global:

var globalVar = "Sou global";
let globalLet = "Também sou global";
const globalConst = 'Eu também!';

function algumaFuncao() {
  console.log(globalVar); // Acessível aqui
}

2. Escopo de Função

Variáveis declaradas dentro de uma função são acessíveis apenas dentro dessa função:

function minhaFuncao() {
  var comEscopoDeFuncao = 'Acessível apenas dentro desta função';

  function funcaoInterna() {
    console.log(comEscopoDeFuncao); // Acessível aqui
  }
}

// console.log(comEscopoDeFuncao); // Erro! Não acessível aqui

3. Escopo de Bloco

Variáveis declaradas com let e const dentro de um bloco são acessíveis apenas dentro desse bloco:

if (true) {
  let comEscopoDeBloco = 'Acessível apenas neste bloco';
  const tambemComEscopoDeBloco = 'Eu também!';
  var semEscopoDeBloco = "Tenho escopo de função";
}

// console.log(comEscopoDeBloco); // Erro!
// console.log(tambemComEscopoDeBloco); // Erro!
console.log(semEscopoDeBloco); // Funciona! (mas não é recomendado)

Escopo Léxico

JavaScript usa escopo léxico, o que significa que as funções internas têm acesso às variáveis de seu escopo externo:

function funcaoExterna(x) {
  function funcaoInterna(y) {
    console.log(x + y); // x é acessível aqui
  }
  return funcaoInterna;
}

const minhaFuncao = funcaoExterna(10);
minhaFuncao(5); // Saída: 15

Esta é a base das closures, que exploraremos no próximo item de conteúdo.

3

Exemplos e Casos de Uso de Closures

Exemplos práticos de closures e casos de uso comuns em JavaScript

Exemplos e Casos de Uso de Closures

Closures são uma das características mais poderosas do JavaScript. Uma closure lhe dá acesso ao escopo de uma função externa a partir de uma função interna.

O que é uma Closure?

Uma closure é criada quando uma função é definida dentro de outra função, e a função interna referencia variáveis da função externa:

function criarContador() {
  let contador = 0;

  return function () {
    contador++;
    return contador;
  };
}

const contador = criarContador();
console.log(contador()); // 1
console.log(contador()); // 2
console.log(contador()); // 3

Casos de Uso Comuns

1. Privacidade de Dados

Closures podem criar variáveis privadas:

function criarContaBancaria(saldoInicial) {
  let saldo = saldoInicial;

  return {
    depositar: function (quantia) {
      saldo += quantia;
      return saldo;
    },
    sacar: function (quantia) {
      if (quantia <= saldo) {
        saldo -= quantia;
        return saldo;
      }
      return 'Fundos insuficientes';
    },
    obterSaldo: function () {
      return saldo;
    },
  };
}

const conta = criarContaBancaria(100);
console.log(conta.depositar(50)); // 150
console.log(conta.sacar(30)); // 120
// saldo não é diretamente acessível

2. Fábricas de Funções

Crie funções especializadas:

function criarMultiplicador(multiplicador) {
  return function (x) {
    return x * multiplicador;
  };
}

const dobrar = criarMultiplicador(2);
const triplicar = criarMultiplicador(3);

console.log(dobrar(5)); // 10
console.log(triplicar(5)); // 15

3. Manipuladores de Eventos com Estado

Mantenha o estado em manipuladores de eventos:

function anexarListeners() {
  let contadorDeCliques = 0;

  document.getElementById('button').addEventListener('click', function () {
    contadorDeCliques++;
    console.log(`Botão clicado ${contadorDeCliques} vezes`);
  });
}

Boas Práticas

  1. Use closures quando precisar de variáveis privadas
  2. Esteja atento ao uso de memória - closures podem impedir a coleta de lixo
  3. Considere usar módulos ou classes para gerenciamento de estado complexo
  4. Use arrow functions para uma sintaxe mais curta quando apropriado
4

Exercício Prático de Closures

Exercício prático para implementar closures

Activity

Exercício Prático de Closures

Agora é hora de colocar seu conhecimento sobre closures em prática! Complete os exercícios a seguir para fortalecer sua compreensão.

Exercício 1: Mensagem Secreta

Crie uma função que armazena uma mensagem secreta e só a revela quando a senha correta é fornecida.

function criarPortadorDeSegredo(segredo, senha) {
  // Seu código aqui
  // Retorne um objeto com métodos para definir e obter o segredo
}

Exercício 2: Carrinho de Compras

Implemente um carrinho de compras usando closures que mantém um estado privado:

function criarCarrinhoDeCompras() {
  // Seu código aqui
  // Retorne métodos: adicionarItem, removerItem, obterTotal, obterItens
}

Exercício 3: Limitador de Taxa

Crie um limitador de taxa que só permite que uma função seja chamada um certo número de vezes:

function criarLimitadorDeTaxa(func, limite) {
  // Seu código aqui
  // Retorne uma função que impõe o limite de taxa
}

Comece Agora

Clique no botão "Iniciar Exercício" abaixo para abrir o ambiente de codificação interativo e começar a praticar!

O exercício inclui:

  • Casos de teste pré-escritos
  • Orientação passo a passo
  • Dicas de solução
  • Feedback em tempo real
4 content items