Kan du skriva nästlade funktioner i JavaScript?


Jag undrar om JavaScript stöder att skriva en funktion inom en annan funktion, eller nästlade funktioner (jag läste det i en blogg). Är detta verkligen möjligt? Faktum är att jag har använt dessa men är osäker på detta koncept. Jag är verkligen otydlig om detta -- snälla hjälp!

Svar #1

Är detta verkligen möjligt.

Ja.

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));

Svar #2

Följande är elakt, men tjänar till att visa hur du kan behandla funktioner som vilket annat slags objekt som helst.

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();

Svar #3

Funktioner är objekt av första klass som kan:

  • Definierad inom din funktion
  • Skapas precis som vilken annan variabel eller objekt som helst vid vilken punkt som helst i din funktion
  • Returnerade från din funktion (vilket kan verka självklart efter de två ovan, men ändå)

För att bygga vidare på exemplet som gavs av Kenny:

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

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

Skulle varna dig med 5.

Svar #4

Ja, det är möjligt att skriva och anropa en funktion som är inbäddad i en annan funktion.

Prova detta:

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

   }
}

Svar #5

Inte bara kan du returnera en funktion som du har skickat in i en annan funktion som en variabel, du kan också använda den för beräkning inuti men definiera den utanför. Se detta exempel:

    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

Relaterade artiklar