2012-11-04 16 views
16

Wołam funkcję w przycisk kliknij tak:Wywołanie funkcji zdefiniowanej wewnątrz innej funkcji w JavaScript

<input type="button" onclick="outer();" value="ACTION">​ 

function outer() { 
    alert("hi");  
} 

To działa dobrze i mam alert:

Teraz kiedy zrobić tak:

function outer() { 
    function inner() { 
     alert("hi"); 
    } 
} 

Dlaczego nie otrzymam alertu?

Chociaż funkcja wewnętrzna ma zakres dostępny w funkcji zewnętrznej.

+0

Gdzie można spróbować zadzwonić 'inner'? – Bergi

Odpowiedz

25

Scoping jest poprawny, jak już zauważyłeś. Jednak nie wywołujesz funkcji inner w dowolnym miejscu.

Można to zrobić albo:

function outer() { 

    // when you define it this way, the inner function will be accessible only from 
    // inside the outer function 

    function inner() { 
     alert("hi"); 
    } 
    inner(); // call it 
} 

Albo

function outer() { 
    this.inner = function() { 
     alert("hi"); 
    } 
} 

<input type="button" onclick="(new outer()).inner();" value="ACTION">​ 
+2

btw czym jest ten fragment onclick = "(new outer()). Inner();", widzę to po raz pierwszy – Mike

+2

@Mike: Lepiej o tym zapomnieć, to naprawdę nie nadaje się do tego. Tworzy nowe wystąpienie "zewnętrznego" konstruktora i wywołuje na nim metodę – Bergi

+0

@Mike - Jeśli potrzebujesz 'inner()' dostępnego poza 'zewnętrznym()', druga metoda pozwoli ci. Ale nie potrzebujesz drugiej drogi do tego wymogu tutaj. – techfoobar

5

Nie wywołujesz funkcji inner, tylko ją definiujesz.

function outer() { 
    function inner() { 
     alert("hi"); 
    } 

    inner(); //Call the inner function 

} 
17

Można zrobić go w module i narażać swoją wewnętrzną funkcję wpuszczeniem go w obiekt.

function outer() { 
    function inner() { 
     console.log("hi"); 
    } 
    return { 
     inner: inner 
    }; 
} 
var foo = outer(); 
foo.inner(); 
+0

Dzięki, sir! Szukano tak długo na takie rozwiązanie. – jsrbn

0

Możesz również wypróbować to.Tutaj zwracasz funkcję "wewnątrz" i wywołujesz z drugim zestawem nawiasów.

function outer() { 
    return (function inside(){ 
    console.log("Inside inside function"); 
    }); 
} 
outer()(); 

Albo

function outer2() { 
    let inside = function inside(){ 
     console.log("Inside inside"); 
    }; 
    return inside; 
    } 
outer2()(); 
Powiązane problemy