Czy potrafisz pisać funkcje zagnieżdżone w JavaScript?

115

Zastanawiam się, czy JavaScript obsługuje pisanie funkcji w innej funkcji, czy funkcje zagnieżdżone (czytam to na blogu). Czy to naprawdę możliwe? W rzeczywistości korzystałem z nich, ale nie jestem pewien tej koncepcji. Nie jestem tego pewien - proszę o pomoc!

Czerwony łabędź
źródło

Odpowiedzi:

196

Czy to naprawdę możliwe.

Tak.

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
źródło
23
Ta metoda nazywa się curry.
Yekver
czy ten kod jest równoważny z tym?
Anne Ortiz
function a (x) {// <- function return {calc: function (y) {// <- funkcja wewnętrzna return x * y; // <- return x use variable from external scope}}; console.log (a (3) (4));
Anne Ortiz
29

Poniższe jest nieprzyjemne, ale służy do zademonstrowania, jak można traktować funkcje jak każdy inny rodzaj obiektu.

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
źródło
4
Świetny przykład. Dodam, że ważne jest, aby pamiętać, że funkcje zdefiniowane w innych funkcjach istnieją tylko w tym zakresie funkcji (chyba, że ​​przypiszesz im funkcję globalną, jak na tym przykładzie).
Mike Sherov
5
Traktuj te funkcje jak obiekty, którymi są
Alex Lomia
17

Funkcje są obiektami pierwszej klasy, którymi mogą być:

  • Zdefiniowane w ramach Twojej funkcji
  • Utworzony tak jak każda inna zmienna lub obiekt w dowolnym momencie funkcji
  • Zwrócony z funkcji (co może wydawać się oczywiste po dwóch powyższych, ale nadal)

Aby oprzeć się na przykładzie podanym przez Kenny'ego:

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

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

Ostrzegałby za pomocą 5.

cgp
źródło
5
Ta metoda nazywa się curry.
Yekver
14

Tak, można napisać i wywołać funkcję zagnieżdżoną w innej funkcji.

Spróbuj tego:

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

   }
}
user3261767
źródło
11

Nie tylko możesz zwrócić funkcję, którą przekazałeś do innej funkcji jako zmienną, ale możesz również użyć jej do obliczeń wewnątrz, ale definiując ją na zewnątrz. Zobacz ten przykład:

    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
Stefana Gruenwalda
źródło
1
używam tego z ajax
jscripter