闭包编译器缩小代码中 (0, obj.method)(param1, param2) 的目的
Purpose of (0, obj.method)(param1, param2) in Closure Compiler minified code
这种方法有什么用?例如,来自Google OAuth API:
(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);
...
我假设它不是。那么有什么区别呢?
编译器确保"this"值正确:
a.f() // 'this' value is "a"
(0, a.f)() // 'this' is the default "this" value
您在 OAuth API 中看到这一点的原因是代码正在使用"重新确定全局符号"编译器传递。 此传递将原本会引入全局范围的符号放置到全局作用域中,以便跨函数作用域 (IIFE) 进行通信到对象上。所以像这样编码:
function f();
// some potentially late loaded code
f();
成为:
(function(_){
_.f = function() {};
})(something);
(function(_){
_.f();
})(something);
但是这里 "f" 的 'this' 值已从默认的 'this' 更改为 "_"。 为了防止发生这种更改,请改用"(0, _.f)()"。
这是编译器可以改进的一个领域,因为即使在它可以确定函数主体中不使用"this"的情况下,它也会这样做。