2014-09-17 18 views
23

Ho un blocco di codice JavaScript come indicato di seguito nella mia pagina html. Quando eseguo questo caricando la pagina. Sto ottenendo di sotto l'uscita sulla mia console del browser."Unchaught TypeError: undefined non è una funzione" nel blocco di codice JavaScript

outer world 
Uncaught TypeError: undefined is not a function 

Come si può vedere nel frammento di codice, io non sto eseguendo la funzione denominata b in qualsiasi parte del codice. Ma durante l'esecuzione del codice, l'output di tale funzione viene fornito con uno undefined is not a function error che non ho potuto trovare da nessuna parte nel mio blocco di codice.

Per aggiungere altro a questo scenario, non sono presenti registri quando rimuovo una delle parti nel codice. questo è. Se rimuovo l'inizializzazione di b dal codice allora non ci sono errori e output. Anche se rimuovo il blocco funzione autoeseguente, non ci sono log o errori. È vero che la riga di inizializzazione di b manca un punto e virgola. ma ciò che lo spinge a fornire una tale uscita mi confonde. Mi aiuteresti a capire un ragionamento per questo comportamento?

Potete per favore aiutarmi a capire perché sta succedendo così?

var b = function() { 
 
    console.log('outer world'); 
 
} 
 

 
(function() { 
 

 
})();

risposta

32

sbaglia un ; dopo aver dichiarato b. Il codice seguente è equivalente

var b = function() { 
    console.log ('outer world'); 
}(function() {})(); 

senza il ; b diventare s self-executing e prende una funzione vuota come parametro. Dopo di che si auto-esegue di nuovo; tuttavia, poiché b non restituisce una funzione, si ottiene un'eccezione.

Suggerisco di non saltare ; fino a diventare js ninja :). Conservare b all'interno per evitare l'inquinamento globale.

(function() { 
    "use strict"; 

    var b = function() { 
     console.log("hi"); 
    }; 
    // other code 
}()); 

Semicolon auto-insertion discussion

Nel caso in cui non si vuole un punto e virgola, aggiungere un operatore prima di auto-esecuzione funzione

var b = function() { console.log('outer world') } 
;(function() { /* ... */ }()) 
+6

Infine, un esempio in cui Javascript non inserisce automaticamente un punto e virgola in cui sembra intuitivo aggiungerlo! – Barmar

+5

Tutto ciò che inizia con '(' o '[' needs' ;. prima di esso. – kornieff

+0

Sì. Questo mi aiuta a capire lo scenario.Vuoi incorporare i collegamenti che Barmar ha fornito nella risposta di Rickard Staaf. Mi ha aiutato a capirlo di più. – mithunsatheesh

5

Hai bisogno di un punto e virgola dopo la tua dichiarazione var, e tra l'altro, si prega di rimuovere lo spazio tra il registro e (

var b = function() { 
     console.log('outer world'); 
}; 
+0

si può fornire una spiegazione quando lasciamo cadere il punto e virgola come ci si dà come un'uscita Cosa è successo in background che non ho nel mio codice ?. I dint execute b in qualsiasi momento – mithunsatheesh

+0

Leggi la risposta di @ kornieff. E vedi http://stackoverflow.com/questions/2846283/what-are-the-rules-for-javascripts-automatic-semicolon-insertion-asi – Barmar

+0

Proverà ad eseguire la funzione definita che emette console.log e invia è il parametro di una nuova funzione anonima, quindi alla fine stai cercando di eseguire una funzione che non esiste, perché quello che hai a quel punto non è più una funzione. –

Problemi correlati