2013-09-05 20 views
6

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ì?

+0

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

+0

Bạn có thể đưa ra một ví dụ không? –

+0

Ý 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

Trả lời

5

Trình biên dịch là đảm bảo giá trị "này" là đúng:

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

Lý do bạn thấy điều này trong API OAuth là mã được sử dụng "rescope những biểu tượng toàn cầu" trình biên dịch thông qua. Điều này vượt qua những nơi biểu tượng mà nếu không sẽ được giới thiệu vào phạm vi toàn cầu để giao tiếp trên phạm vi chức năng (IIFEs) vào một đối tượng. Vì vậy, mã như thế này:

function f(); 

// some potentially late loaded code 
f(); 

trở thành:

Nhưng ở đây "f" 's 'này' giá trị đã thay đổi từ mặc định 'này' để "_". Để ngăn chặn thay đổi đó xảy ra, "(0, _.f)()" được sử dụng thay thế.

Đây là khu vực mà trình biên dịch có thể cải thiện vì nó thực hiện điều này ngay cả trong trường hợp nó có thể xác định rằng "điều này" không được sử dụng trong phần thân của hàm.

Các vấn đề liên quan