2013-09-05 5 views
6

इस दृष्टिकोण के लिए क्या दृष्टिकोण है? उदाहरण के लिए, गूगल OAuth एपीआई से:क्लोजर कंपाइलर में कोड (0, obj.method) (param1, param2) का उद्देश्य minified 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); 
मेरे लिए

, यह बस

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

outputting करने के लिए मैं यह नहीं है यह सोचते हैं रहा हूँ समान होना प्रतीत होता है। तो क्या अंतर है?

+0

कंपाइलर अल्पविराम ऑपरेटर को दूसरी अभिव्यक्ति को अभिव्यक्ति के रूप में व्याख्या करने के लिए मजबूर कर रहा है। यदि '_.Q' के बजाय हमारे पास एक अनाम कार्य था, तो इसे लागू किया जाएगा (त्रुटि को फेंकने के बजाय)। इसके लिए यही एकमात्र कारण है जिसके बारे में मैं सोच सकता हूं। – bfavaretto

+0

क्या आप एक उदाहरण दे सकते हैं? –

+0

मेरा मतलब था '(0, फ़ंक्शन (ए, बी) {}) ("gapi.auth.authorize", _.Ek.Ff)' ठीक है, लेकिन 'फ़ंक्शन (ए, बी) {} ("gapi.auth प्राधिकरण ", _.Ek.Ff)' नहीं है (वाक्यविन्यास त्रुटि)। इसलिए संकलक इसे सुरक्षित रखने के लिए जोड़ रहा है, शून्य के बाद क्या होता है इस पर निर्भर करता है। किसी भी मामले में, शून्य बिल्कुल जरूरी नहीं होगा, इसलिए अब मेरे पास एक और अनुमान है: शायद कंपाइलर के लिए '_.Q' के बजाय 'eval' डालना संभव है; इस मामले में, '(0, eval)' एक अप्रत्यक्ष eval कॉल (या "वैश्विक eval") मजबूर करेगा। Http://stackoverflow.com/questions/9107240/1-evalthis-vs-evalthis-in-javascript देखें। – bfavaretto

उत्तर

5

संकलक सुनिश्चित है "इस" मान सही है:

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

कारण आप OAuth एपीआई में देख कोड "वैश्विक प्रतीक rescope" संकलक पास उपयोग कर रहा है। यह उन प्रतीकों को पास करता है जो अन्यथा किसी ऑब्जेक्ट पर फ़ंक्शन स्कोप (आईआईएफई) में संवाद करने के लिए वैश्विक दायरे में पेश किए जाएंगे। इस तरह तो कोड:

function f(); 

// some potentially late loaded code 
f(); 

हो जाता है:

लेकिन यहाँ "f" 'एस' इस 'मान डिफ़ॉल्ट से बदल गया है' इस ' "_" करने के लिए। उस परिवर्तन को होने से रोकने के लिए, "(0, _.f)()" इसके बजाए प्रयोग किया जाता है।

यह एक ऐसा क्षेत्र है जहां संकलक सुधार सकता है क्योंकि यह उन मामलों में भी करता है जहां यह निर्धारित कर सकता है कि "यह" फ़ंक्शन के शरीर में उपयोग नहीं किया जाता है।

संबंधित मुद्दे