2013-09-05 5 views
6

A cosa serve questo approccio? Per esempio, dal API di Google OAuth:Scopo di (0, oggetto) (param1, param2) nel codice minatore compilatore di chiusura

(0, _.Q)("gapi.auth.authorize", _.Ek.Ff); 
(0, _.Q)("gapi.auth.checkSessionState", _.Ek.MH); 
(0, _.Q)("gapi.auth.getAuthHeaderValueForFirstParty", _.Ek.Qe); 
(0, _.Q)("gapi.auth.getToken", _.Ek.$f); 
(0, _.Q)("gapi.auth.getVersionInfo", _.Ek.Wk); 
(0, _.Q)("gapi.auth.init", _.Ek.gb); 
(0, _.Q)("gapi.auth.setToken", _.Ek.Ym); 

Per me, questo sembra essere identico a quello semplicemente l'output

_.Q("gapi.auth.authorize", _.Ek.Ff); 
_.Q("gapi.auth.checkSessionState", _Ek.MH); 
... 

sto supponendo che non è. quindi qual è la differenza?

+0

Il compilatore impone il secondo argomento all'operatore virgola da interpretare come espressione. Se invece di '_.Q' avessimo una funzione anonima, sarebbe invocata (invece di lanciare un errore). Questa è l'unica ragione per cui posso pensare. – bfavaretto

+0

Puoi fare un esempio? –

+0

Intendevo '(0, funzione (a, b) {}) (" gapi.auth.authorize ", _.Ek.Ff)' è ok, ma 'function (a, b) {} (" gapi.auth .authorize ", _.Ek.Ff)' non lo è (errore di sintassi). Quindi il compilatore potrebbe aggiungere che per essere sicuro, dipende da cosa va dopo lo zero. In ogni caso, lo zero non sarebbe affatto necessario, quindi ora ho un'altra ipotesi: forse è possibile che il compilatore metta 'eval' invece di '_.Q'; in questo caso, '(0, eval)' costringerebbe una chiamata eval indiretta (o "eval globale"). Vedi http://stackoverflow.com/questions/9107240/1-evalthis-vs-evalthis-in-javascript. – bfavaretto

risposta

5

Il compilatore è garantire il valore "this" è corretto:

a.f() // 'this' value is "a" 
(0, a.f)() // 'this' is the default "this" value 

La ragione si vede questo nel API OAuth è il codice utilizza il pass "rescope simboli globali" compilatore. Questo passaggio inserisce simboli che sarebbero altrimenti introdotti in ambito globale per comunicare attraverso gli ambiti di funzione (IIFE) su un oggetto. Quindi il codice come questo:

function f(); 

// some potentially late loaded code 
f(); 

diventa:

Ma qui "f" 's 'questo' valore è cambiato dal default 'questo' a "_". Per evitare che questo cambiamento si verifichi, viene utilizzato "(0, _.f)()".

Questa è un'area in cui il compilatore può migliorare perché lo fa anche nei casi in cui può determinare che "questo" non è utilizzato nel corpo della funzione.