Motivo alla base di questa auto invocante variante di funzione anonima

Mentre osservavo il codice su github, ho trovato quanto segue:

(function() { }).call(this); 

Questa è chiaramente una funzione anonima autoinvitante. Ma perché è scritto in questo modo? Sono abituato a vedere la variante canonica (function() {})() .

C’è qualche particolare vantaggio nell’uso di .call(this) per una funzione anonima auto-invocante?


Modifica: sembra che alcuni ambienti commonjs lo impostino su un valore non globale al livello più alto di un modulo. Quali, e cosa impostano a ciò che potresti voler preservare?

.call(this) (era in realtà solo () fino a quando non l’ho modificato) assicura che il tuo livello superiore sia coerente attraverso la modalità strict, --bare opzione --bare e / o l’ambiente di esecuzione (dove il livello superiore non punta all’object globale ).

Per impostazione predefinita, richiamando una funzione come (function(){/*...*/})() imposterà il valore di this nella funzione su window (in un browser) indipendentemente dal valore di this può essere nel che racchiude il contesto in cui è stata creata la funzione.

L’uso della call ti consente di impostare manualmente il valore di this a ciò che desideri. In questo caso, lo sta impostando su qualunque valore this trovi nel contesto che lo racchiude.

Prendi questo esempio:

 var obj = { foo:'bar' }; (function() { alert( this.foo ); // "bar" }).call( obj ); 

http://jsfiddle.net/LWFAp/

Puoi vedere che siamo stati in grado di impostare manualmente il valore di this sull’object a cui fa riferimento la variabile obj .

Usando:

 > (function() { > ... > }).call(this);` 

allora questo nell’ambito del codice (il probaby l’object globale) è impostato come la funzione è questo object. Per quanto ne so, è equivalente a:

 (function(global) { // global references the object passed in as *this* // probably the global object })(this); 

In un browser, in genere la finestra è (o si comporta come se fosse) un alias per l’object globale.

 C={ descript: "I'm C!
", F: function() { //set this to the caller context's 'this' (function() { document.write(this.descript); }).call(this); //set this to 'window' or 'undefined' depend the mode (function() { document.write(this.descript); })(); //member function's 'this' is the object self document.write(this.descript); } } window.descript="I'm window!
"; CF();

(function() {}).call(this); potrebbe impostare this in anonimo al contesto del chiamante, in C sopra. (function() {})(); imposterà this a window o undefined dipende dalla modalità.

Le funzioni di autoinvocazione sono utili per eseguire il suo contenuto immediatamente quando viene caricato lo script. Questo è conveniente per inizializzare gli elementi di ambito globale.