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!

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


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

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.


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

   }
}

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

1
używam tego z ajax
jscripter
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.