Differenza tra function di chiamata e function di riferimento?

Guarda il seguente codice:

window.onload = someFunction; 

Molte volte vedo l'uso di questo tipo di codice e persino uso lo stesso. Ma ci sono ancora poche cose poco chiare.

  1. Quanto sopra è una chiamata a un someFunction non appena la pagina viene caricata, giusto. Ma, non dovremmo call una function con parentesi () ?
  2. Dalla mia comprensione, stiamo solo assegnando someFunction a window.onload , quindi possiamo o non dovremmo call window.onload() ;
  3. Ci sono casi in cui functionName() e functionName diventano intercambiabili. Perché in molti luoghi e in vari API, ho visto call la function senza parentesi.

Non stai chiamando la function, stai dicendo al browser che funziona per call, onload.

Fare riferimento a una function e call una function non sono mai intercambiabili: sono cose completamente diverse.

Tuttavia, è ansible call una function che restituisce una function:

 function getFunction() { return function() { alert("I'm the real onload function."); }; } window.onload = getFunction(); 

In questo caso, si sta registrando una function di richiamata per l'evento di onload della window. A tal fine, si dà un riferimento alla function, non si esegue la function (a less che, ovviamente, l'esecuzione della function restituisca un'altra function che viene utilizzata come gestore di richiamata). La function specificata verrà eseguita quando si verifica l'evento di onload , cioè quando la pagina finisce di caricamento.

In JavaScript, le parentesi contano. Nel tuo caso, assegni l'object function in sé ad un determinato slot della window . Quando mettete le parentesi, chiamate esplicitamente la function, quindi il valore di someFunction() è il valore restituito della function, non l'object function. In breve :

  • quando si vede una function senza parentesi, si affronta un'espressione che ha il valore dell'object function stesso
  • quando si vede una function con parentesi, l'espressione ha valore di restituito valore della function, perché le parentesi indicano una chiamata della function

Un caso speciale è someVar = new someConstructor; che non dovrebbe essere usato in generale e non segue la mia breve spiegazione sopra. Per una buona spiegazione della function e quella particolare affermazione di cui sopra, vedi il libro meraviglioso di Douglas Crockford Javascript, le Buone Parti .