Per Metodo 1, la funzione e il relativo simbolo vengono elaborati dal parser prima che venga eseguito qualsiasi codice in questo file. Quindi la definizione è "issata" all'inizio di qualsiasi ambito e il simbolo può essere utilizzato in qualsiasi parte dello scope in cui è definito. L'ordine di dichiarazione all'interno di un ambito non ha importanza.
Quindi, con il primo metodo, puoi fare ciò:
hello();
function hello() {
console.log("hello");
}
perché il primo passaggio sul codice per analizzarlo definirà il simbolo ciao come funzione. Pertanto, nel secondo passaggio quando il codice viene effettivamente eseguito, il simbolo hello
esiste già, quindi può essere chiamato in qualsiasi momento.
Per Metodo 2, la funzione viene elaborata dal parser, ma il simbolo che contiene la funzione non viene assegnato un valore fino a quando l'istruzione di assegnazione non viene eseguita in fase di esecuzione. Codice in questo ambito prima che questa linea non possa usare il simbolo (perché non ha ancora un valore). L'ordine di assegnazione all'interno di un ambito è importante e deve essere prestato attenzione a
Usando, il tuo secondo metodo, lo stesso ordine dell'esempio precedente non funzionerà:
hello();
var hello = function() {
console.log("hello");
}
perché il simbolo hello
non è ancora definito quando si tenta di usarlo. Invece, dovresti fare questo:
var hello = function() {
console.log("hello");
}
hello();
Le persone sembrano avere una preferenza per uno stile rispetto all'altro. Personalmente, mi piace il primo stile in quanto sembra più semplice lasciare che il parser definisca tutti i simboli delle funzioni e non debba preoccuparsi dell'ordine di dichiarazione. L'unica eccezione che faccio è se in realtà sto assegnando funzioni diverse a una determinata variabile a seconda di alcune condizioni. Quindi, potrei usare il secondo stile.