Cách tiếp cận này là gì? Ví dụ, từ API Google OAuth:Mục đích của (0, obj.method) (param1, param2) trong Trình biên dịch đóng gói được rút gọn mã số
(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);
Đối với tôi, điều này sẽ dường như giống hệt nhau chỉ đơn giản là xuất ra
_.Q("gapi.auth.authorize", _.Ek.Ff);
_.Q("gapi.auth.checkSessionState", _Ek.MH);
...
Tôi giả định nó không phải là. Vậy sự khác biệt là gì?
Trình biên dịch bắt buộc đối số thứ hai cho toán tử dấu phẩy được hiểu là biểu thức. Nếu thay vì '_.Q', chúng ta có một hàm ẩn danh, nó sẽ được gọi ra (thay vì ném một lỗi). Đây là lý do duy nhất cho điều này mà tôi có thể nghĩ đến. – bfavaretto
Bạn có thể đưa ra một ví dụ không? –
Ý tôi là '(0, hàm (a, b) {}) (" gapi.auth.authorize ", _.Ek.Ff)' không sao, nhưng 'hàm (a, b) {} (" gapi.auth .authorize ", _.Ek.Ff)' không phải là (lỗi cú pháp). Vì vậy, trình biên dịch có thể thêm rằng để được an toàn, phụ thuộc vào những gì diễn ra sau 0. Trong mọi trường hợp, số không sẽ không cần thiết chút nào, vì vậy bây giờ tôi có một dự đoán khác: có thể trình biên dịch đặt 'eval' thay vì' _.Q'; trong trường hợp này, '(0, eval)' sẽ bắt buộc một cuộc gọi eval gián tiếp (hoặc "eval toàn cầu"). Xem http://stackoverflow.com/questions/9107240/1-evalthis-vs-evalthis-in-javascript. – bfavaretto