2013-09-05 6 views
6

Für was ist dieser Ansatz? Zum Beispiel aus dem Google OAuth API:Zweck von (0, obj.method) (param1, param2) in Closure Compiler vereinheitlichter Code

(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); 

Für mich wäre dies scheint identisch zu sein einfach zu

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

Ausgeben Ich nehme an, es ist nicht. Was ist der Unterschied?

+0

Der Compiler zwingt das zweite Argument zum Komma-Operator, um als Ausdruck interpretiert zu werden. Wenn wir anstelle von '_.Q' eine anonyme Funktion hätten, würde sie aufgerufen werden (anstatt einen Fehler zu erzeugen). Dies ist der einzige Grund dafür, den ich mir vorstellen kann. – bfavaretto

+0

Können Sie ein Beispiel geben? –

+0

Ich meinte '(0, Funktion (a, b) {}) (" gapi.auth.authorize ", _.Ek.Ff)' ist in Ordnung, aber 'function (a, b) {} (" gapi.auth .authorize ", _.Ek.Ff)' ist nicht (Syntaxfehler). Also könnte der Compiler das hinzufügen, um sicher zu sein, hängt davon ab, was nach der Null geht. In jedem Fall wäre die Null überhaupt nicht notwendig, also habe ich eine andere Schätzung: vielleicht ist es für den Compiler möglich, eval anstelle von _ _Q zu setzen; In diesem Fall würde '(0, eval)' einen indirekten Eval-Aufruf (oder "globales Eval") erzwingen. Siehe http://stackoverflow.com/questions/9107240/1-evalthis-vs-evalthis-in-javascript. – bfavaretto

Antwort

5

Der Compiler ist die Gewährleistung des "this" Wert korrekt ist:

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

Der Grund, warum Sie dies in der OAuth API sehen, ist der Code des "rescope globale Symbole" Compiler Pass verwendet. Dieser Pass platziert Symbole, die andernfalls in den globalen Gültigkeitsbereich eingeführt würden, um über Funktionsbereiche (IIFEs) auf ein Objekt zu kommunizieren. So Code wie folgt:

function f(); 

// some potentially late loaded code 
f(); 

wird:

Aber hier "f" 's 'das diese 'auf "_"' Wert vom Standard geändert'. Um diese Änderung zu verhindern, wird stattdessen "(0, _.f)()" verwendet.

Dies ist ein Bereich, in dem der Compiler verbessert werden könnte, da dies auch in Fällen geschieht, in denen festgestellt werden kann, dass "dies" nicht im Rumpf der Funktion verwendet wird.