2013-09-05 16 views
6

Bu yaklaşım nedir? Örneğin, Google OAuth API: Bana göre(0, obj.method) (param1, param2) 'in amacı Kapanış Derleyici 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); 

, bu sadece ben değil tahmin ediyorum

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

çıkışı aynı olacak gibi görünüyor. fark nedir?

+0

Derleyici, ikinci bağımsız değişkeni ifade olarak yorumlanacak virgül operatörüne zorluyor. Eğer _.Q' yerine anonim bir işlevimiz olsaydı, (hata atmak yerine) çağrılırdı. Düşünebildiğim tek nedeni bu. – bfavaretto

+0

Bir örnek verebilir misiniz? –

+0

Yani (0, işlev (a, b) {}) ("gapi.auth.authorize", _.Ek.Ff) 'diyorum, fakat işlev (a, b) {} (" gapi.auth " .authorize ", _.Ek.Ff)" (sözdizimi hatası) değil. Yani derleyici güvenli olmak için ekliyor olabilir, sıfırdan sonra ne olduğuna bağlı. Her halükarda, sıfır gerekli olmayacaktı, bu yüzden şimdi başka bir tahminde bulunacağım: belki de derleyicinin '_.Q' yerine' eval 'koyması mümkün; bu durumda, “(0, değerlendirme)” dolaylı bir değerlendirme çağrısı (ya da “küresel değerlendirme”) zorlar. Http://stackoverflow.com/questions/9107240/1-evalthis-vs-evalthis-in-javascript adresine bakın. – bfavaretto

cevap

5

derleyici "Bu" değer doğrudur sağlamaktır:

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

OAuth API görüyoruz neden kodu "küresel semboller rescope" derleyici geçişi kullanarak olmasıdır. Bu geçiş, aksi takdirde bir nesneye işlev kapsamları (IIFE'ler) arasında iletişim kurmak için küresel kapsam içine sokulacak sembolleri yerleştirir. Yani böyle kod:

function f(); 

// some potentially late loaded code 
f(); 

olur:

Ama burada "f" 's 'bu' öntanımlı değer değişti 'bu' "_" için. Bu değişikliğin olmasını önlemek için, bunun yerine "(0, _.f)()" kullanılır.

Bu, derleyicinin geliştirebileceği bir alandır çünkü bu, "bu" işlevinin gövdesinde kullanılmadığını belirleyebildiği durumlarda bile bunu yapar.