Fechamento no ECMAScript

O ponto mais fácil de ser mal interpretado no ECMAScript é que ele suporta closures (fechamentos).

Closure, que se reflete na representação léxica que inclui variáveis não calculadas, ou seja, a função pode usar variáveis definidas fora da função.

Exemplo simples de closure

O uso de variáveis globais no ECMAScript é um exemplo simples de closure. Pense no seguinte código:

var sMessage = "hello world";
function sayHelloWorld() {
  alert(sMessage);
}
sayHelloWorld();

Neste trecho de código, após o script ser carregado na memória, não há cálculo do valor da variável sMessage para a função sayHelloWorld(). A função sayHelloWorld() captura o valor de sMessage apenas para uso futuro, ou seja, o interpretador sabe que deve verificar o valor de sMessage ao chamar a função. sMessage será atribuído no chamada da função sayHelloWorld() (última linha) e exibirá a mensagem "hello world".

Exemplo de closure complexa

Definir outra função dentro de uma função torna o closure mais complexo. Por exemplo:

var iBaseNum = 10;
function addNum(iNum1, iNum2) {
  function doAdd() {
    return iNum1 + iNum2 + iBaseNum;
  }
  return doAdd();
}

Aqui, a função addNum() inclui a função doAdd() (closure). A função interna é um closure porque ela obtém os parâmetros iNum1 e iNum2 da função externa e o valor da variável global iBaseNum. O último passo da função addNum() chama doAdd(), adiciona os dois parâmetros e o valor da variável global, e retorna a soma.

Aqui, o conceito importante a ser compreendido é que a função doAdd() não aceita parâmetros, os valores que ela usa são obtidos do ambiente de execução.

Pode ver que o closure é uma parte muito poderosa e versátil do ECMAScript, usada para executar cálculos complexos.

Dica:Como ao usar qualquer função avançada, usar闭包时要小心,因为它们可能会变得非常复杂。