2012-11-04 15 views
16

sto chiamando una funzione fare clic sul pulsante in questo modo:Chiamare una funzione definita all'interno di un'altra funzione in Javascript

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

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

Funziona benissimo ed ottengo un avviso:

Ora quando faccio in questo modo:

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

Perché non ricevo un avviso?

Sebbene la funzione interna abbia un ambito disponibile nella funzione esterna.

+0

Da dove si tenta di chiamare 'inner'? – Bergi

risposta

25

L'ambito è corretto come hai notato. Tuttavia, non stai chiamando la funzione inner ovunque.

Si può fare sia:

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 
} 

O

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

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

btw qual'è quel pezzo chiamato onclick = "(new outer()). Inner();", lo vedo per la prima volta – Mike

+2

@Mike: Meglio dimenticarlo, non è proprio adatto a questo. Sta creando una nuova istanza del costruttore 'outer' e chiama un metodo su di esso – Bergi

+0

@Mike - Nel caso in cui sia necessario' inner() 'accessibile all'esterno di' outer() ', il secondo modo vi lascerà. Ma non hai bisogno del secondo modo per il tuo requisito qui. – techfoobar

5

Non si sta chiamando la funzione inner, è sufficiente definirla.

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

    inner(); //Call the inner function 

} 
17

si potrebbe fare in un modulo ed esporre la vostra funzione interna restituendo in un oggetto.

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

Grazie signore! Ho cercato così tanto tempo per una soluzione come questa. – jsrbn

0

Si può anche provare this.Here si restituisce la funzione "dentro" e invocando con la seconda serie di parentesi.

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

O

function outer2() { 
    let inside = function inside(){ 
     console.log("Inside inside"); 
    }; 
    return inside; 
    } 
outer2()(); 
Problemi correlati