Você pode escrever funções aninhadas em JavaScript?

116

Gostaria de saber se o JavaScript oferece suporte a escrever uma função dentro de outra função, ou funções aninhadas (li em um blog). Isso é realmente possível? Na verdade, eu os usei, mas não tenho certeza desse conceito. Eu realmente não estou certo sobre isso - por favor, ajude!

Cisne Vermelho
fonte

Respostas:

197

Isso é realmente possível.

Sim.

function a(x) {    // <-- function
  function b(y) { // <-- inner function
    return x + y; // <-- use variables from outer scope
  }
  return b;       // <-- you can even return a function.
}
console.log(a(3)(4));

Kennytm
fonte
23
Este método é denominado currying.
Yekver
este código é equivalente a este?
Anne Ortiz
function a (x) {// <- retorno da função {calc: function (y) {// <- retorno da função interna x * y; // <- retorno x usar variáveis ​​do escopo externo}}; console.log (a (3) (4));
Anne Ortiz
29

O seguinte é desagradável, mas serve para demonstrar como você pode tratar funções como qualquer outro tipo de objeto.

var foo = function () { alert('default function'); }

function pickAFunction(a_or_b) {
    var funcs = {
        a: function () {
            alert('a');
        },
        b: function () {
            alert('b');
        }
    };
    foo = funcs[a_or_b];
}

foo();
pickAFunction('a');
foo();
pickAFunction('b');
foo();
Quentin
fonte
4
Ótimo exemplo. Eu acrescentaria que é importante observar que as funções definidas dentro de outras funções só existem nesse escopo de funções (a menos, é claro, que você atribua uma função global a ela, conforme este exemplo).
Mike Sherov
5
Trate essas funções como objetos que são
Alex Lomia
17

Funções são objetos de primeira classe que podem ser:

  • Definido em sua função
  • Criado como qualquer outra variável ou objeto em qualquer ponto da sua função
  • Retornou de sua função (o que pode parecer óbvio após os dois acima, mas ainda assim)

Para desenvolver o exemplo dado por Kenny:

   function a(x) {
      var w = function b(y) {
        return x + y;
      }
      return w;
   };

   var returnedFunction = a(3);
   alert(returnedFunction(2));

Iria alertá-lo com 5.

cgp
fonte
5
Este método é denominado currying.
Yekver
14

Sim, é possível escrever e chamar uma função aninhada em outra função.

Experimente isto:

function A(){
   B(); //call should be B();
   function B(){

   }
}
user3261767
fonte
11

Você não só pode retornar uma função que passou para outra função como uma variável, mas também pode usá-la para cálculos internos, mas definindo-a externamente. Veja este exemplo:

    function calculate(a,b,fn) {
      var c = a * 3 + b + fn(a,b);
      return  c;
    }

    function sum(a,b) {
      return a+b;
    }

    function product(a,b) {
      return a*b;
    }

    document.write(calculate (10,20,sum)); //80
    document.write(calculate (10,20,product)); //250
Stefan Gruenwald
fonte
1
eu uso isso com ajax
jscripter