2010-02-23 25 views
8

nextplease.init = function() {...} è una funzione senza argomenti. Mi aspetto che nextplease.init e function() {nextplease.init();} si comportino in modo identico. C'è qualche differenza tra loro (ovviamente, è possibile assegnare qualcosa a nextplease.init, ma escludiamolo)? In particolare, può esserci una differenza di comportamento tra window.addEventListener("load", nextplease.init, false); e window.addEventListener("load", function() {nextplease.init();}, false);?Valori di funzione in JavaScript

Il bug che sto cercando di trovare è descritto in Objects in JavaScript defined and undefined at the same time (in a FireFox extension) Qualcuno ha suggerito che l'utilizzo del primo modulo invece del secondo potrebbe fare la differenza.

+2

In realtà nel JS si può accedere argomenti dalla variabile 'arguments', in modo che non si può in modo affidabile dire quanti argomenti una funzione avrebbe preso. – kennytm

+0

Vero, ma non è stato fatto in questo caso. Fornirò un collegamento al codice. –

+1

Il secondo crea un nuovo contesto di esecuzione in cui verrà eseguito nextplease.init(). Lo stack di contesto della catena di obiettivi/esecuzione sarà quindi più grande. –

risposta

4

Una differenza importante è il valore della parola chiave "this" all'interno del corpo della funzione a cui fa riferimento nextplease.init.

assumere nextplease è definito come tale:

nextplease = {}; 
nextplease.someCustomProperty = "hello"; 
nextplease.init = function() { alert(this.someCustomProperty); } 

Nel primo esempio, il valore di "questa" sarebbe l'oggetto DOM, e l'avviso sarebbe sicuro:

window.addEventListener("load", nextplease.init, false);  

Nel seconda forma, il valore di "questo" sarebbe l'oggetto nextplease, e l'avviso avrebbe detto, "ciao":

window.addEventListener("load", function() {nextplease.init();}, false); 

riferimento alla documentazione MDC:

https://developer.mozilla.org/en/DOM/element.addEventListener

0

Ci sono 2 possibili differenze

window.addEventListener("load", nextplease.init, false); 

Questa chiamerà la funzione e questo è tutto. Se si desidera aggiungere parametri, questo non sarebbe in grado di impostarli.

window.addEventListener("load", function() {nextplease.init();}, false); 

Questo, d'altra parte, consente di chiamare più di una funzione e consente di impostare i parametri. Inoltre, aggiunge un overhead aggiuntivo alla chiamata di una funzione e all'archiviazione di una funzione in memoria.

0

Questi due:

window.addEventListener("load", nextplease.init, false); 
window.addEventListener("load", function() {nextplease.init();}, false);? 

sono quasi esattamente lo stesso, assumendo nextplease.init è un oggetto funzione.

L'unica differenza è che nel secondo caso, qualsiasi argomento passato alla funzione esterna (anche se la sua firma non ne definisce nessuno, possono ancora essere passati) non verrà passato a nextplease.init(). Ma dal momento che questa è solo l'API addEventListener, sai cosa verrà passato prima del tempo.