Sono nuovo di Javascript e mi sono confuso dal funzionamento della dichiarazione di funzione. Ho fatto un po 'di test su questo e ottenuto alcuni risultati interessanti:Dichiarazione di funzione ambigua in Javascript
say();
function say()
{
alert("say");
}
L'attaccante dichiarazione lavorato e pop-up "dire"
Al contrario
say();
say = function()
{
alert("say");
}
non ha funzionato, anche se anche dichiarato oggetto funzione
Se dichiariamo la funzione e la dichiariamo in seguito:
Ho ottenuto "dire" invece di "parlare". È una sorpresa!
OK. Sembra che funzioni solo la dichiarazione delle funzioni più recente. Poi lascia dichiarare oggetto funzione prima e poi una funzione di "regolare":
say = function()
{
alert("speak");
}
say();
function say()
{
alert("say");
}
say();
Un'altra sorpresa, è stato "parlare" seguito da "parlare". La dichiarazione di funzione "regolare" non ha funzionato affatto!
C'è una spiegazione di tutti loro? E se la dichiarazione di funzione "regolare" è davvero così "fragile" e può essere facilmente sostituita dall'oggetto funzione con lo stesso nome, dovrei stare lontano da quello?
Un'altra domanda è: con solo il formato oggetto funzione, la dichiarazione anticipata diventa impossibile? C'è un modo per "simulare" quello in Javascript?
Vedo i tuoi punti. Ma qual è lo scopo se definisco oggetti funzione locali? Ho provato a chiamare window.say() e il risultato non è ancora quello che mi aspettavo:
function say() { alert("say"); } window.say();
popup "dire" evar say = function() { alert("speak"); } window.say(); function say() { alert("say"); } window.say();
popup "parlare" due volte. Significa che sia la funzione "globale" che l'oggetto "locale" sono membri dell'oggetto finestra? –scusa non so come formattare il commento ... :( –
@Xiang: Il motivo per cui ottieni "speak" due volte è che l'interprete JavaScript fa due passaggi: nel primo, crea le proprietà dell'oggetto Variabile (che è usato per cercare variabili nell'attuale scope ed è l'oggetto globale nel codice globale) per le dichiarazioni 'var' e le dichiarazioni di funzione, e nel secondo passaggio esegue le istruzioni nell'ordine.Il punto cruciale è che' var' le affermazioni sono effettivamente suddivise in due: nel primo passaggio, una proprietà con valore 'indefinito' viene aggiunta all'oggetto Variable se non contiene già una proprietà con quel nome (continua ...) –