2010-07-09 16 views
71

Zastanawiam się, czy JavaScript obsługuje pisanie funkcji w ramach innej funkcji lub funkcji zagnieżdżonych (czytałem ją na blogu). Czy to naprawdę możliwe? W rzeczywistości użyłem tych, ale nie jestem pewien tej koncepcji. Naprawdę nie jestem pewien - proszę o pomoc!Czy możesz napisać funkcje zagnieżdżone w JavaScript?

Odpowiedz

142

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

+11

Ta metoda nazywa się curry. – Yekver

+29

Woh! Potrzebuję sedacji po zobaczeniu tego! –

24

Poniższy tekst jest nieprzyjemny, ale służy do zademonstrowania, jak można traktować funkcje, jak każdy inny obiekt.

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

doskonałym przykładem. Dodam, że ważne jest, aby pamiętać, że funkcje zdefiniowane w innych funkcjach istnieją tylko w tym zakresie funkcji (chyba że, oczywiście, przypisujesz do niego funkcję globalną, jak w tym przykładzie). –

+2

Traktuj te funkcje jak obiekty, które są –

11

Funkcje są klasy obiektów pierwszymi, które mogą być:

  • zdefiniowana w swojej funkcji
  • Utworzony tak jak każda inna zmienna lub obiektu w dowolnym punkcie swojej funkcji
  • Powrócono z funkcji (co może wydawać się oczywiste po dwóch powyższych, ale nadal)

Aby zbudować na przykładzie podanym przez Kenny:

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

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

ostrzeże cię 5.

+2

Ta metoda nazywa się curry. – Yekver

7

nie tylko można wrócić do funkcji które przeszły do ​​innej funkcji jako zmienna, możesz również użyć go do obliczeń wewnątrz, ale definiując go 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 ajaxem – jscripter

9

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

Spróbuj tego:

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

    } 
} 
Powiązane problemy