Objectif de (0, obj.method) (param1, param2) dans le code minifieur Compilateur de fermeture

À quoi sert cette approche? Par exemple, à partir de l'API Google OAuth:

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

Pour moi, cela semble être identique à la simple sortie

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

Je suppose que ce n'est pas le cas. Alors quelle est la différence?

Le compilateur garantit que la valeur "this" est correcte:

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

La raison pour laquelle vous voyez cela dans l'API OAuth est que le code utilise la passe de compilation "rescope global symbols". Ce passage place des symboles qui, autrement, seraient introduits dans une portée globale pour communiquer entre les champs de fonctions (IIFE) sur un objet. Donc code comme ceci:

 function f(); // some potentially late loaded code f(); 

devient:

 (function(_){ _.f = function() {}; })(something); (function(_){ _.f(); })(something); 

Mais ici, "f" 's' cette valeur a changé de la valeur par défaut 'this' à "_". Pour empêcher ce changement de se produire, "(0, _.f) ()" est utilisé à la place.

Il s'agit d'un domaine où le compilateur pourrait s'améliorer parce qu'il le fait même dans les cas où il peut déterminer que «ceci» n'est pas utilisé dans le corps de la fonction.