2012-03-16 28 views
10

Trong khi điều tra google script plusone, tôi đã nhìn thấy sau cú pháp nhiều lần:Lý do sử dụng cú pháp như vậy (0, _.Em)();

(0, _.Em)(); 

Giả sử _.Em là một chức năng tuyên bố trên sẽ cho kết quả trong việc kêu gọi hàm, đó là khá rõ ràng. Nếu, mặt khác, nó sẽ không xác định, kết quả sẽ không giống như làm đơn giản là _.Em()?

Có ai có thể làm sáng tỏ ý tưởng đằng sau việc sử dụng cú pháp như vậy không?

+0

xem thêm [Nhà điều hành dấu phẩy có ảnh hưởng đến ngữ cảnh thực thi trong Javascript không?] (Http://stackoverflow.com/q/36076794/1048572) – Bergi

Trả lời

8

Về cơ bản, cú pháp này cho phép gọi _.Em() trong ngữ cảnh của đối tượng window thay vì _.

Giả sử bạn có mã này:

Foo = function() { 
    this.foo = "foo"; 
}; 

Foo.prototype.Em = function() { 
    alert(this.foo); 
}; 

var _ = new Foo(); 

Phát hành _.Em() sẽ dẫn đến Em() được gọi là trong bối cảnh _. Bên trong hàm, từ khóa this sẽ tham chiếu đến _, vì vậy, foo sẽ được in.

Phát hành (0, _.Em)() tách riêng cuộc gọi phương thức khỏi đối tượng và thực hiện cuộc gọi trong ngữ cảnh chung. Bên trong hàm, từ khóa this sẽ tham chiếu đến window, vì vậy undefined sẽ được in, vì window không có thuộc tính foo.

Bạn có thể kiểm tra sự khác biệt giữa hai cú pháp trong this fiddle.

+0

Nhưng tại sao '(0, _.EM)()' hoạt động như cái đó? – Niko

+5

Do việc đánh giá '_.Em', việc áp dụng toán tử cuộc gọi không giống như gọi trực tiếp' _.Em() '. Đánh giá '_.Em' độc lập trả về một" hàm tự do ", vì thiếu một thuật ngữ tốt hơn, và hàm đó sẽ không được gắn với đối tượng' _' nữa. Kết quả tương tự có thể thu được bằng cách viết 'var f = _.Em; f(); '. Trong cả hai trường hợp, từ khóa 'this' này sẽ tham chiếu đến' window' thay vì '_' bên trong hàm. –

+0

+1, câu trả lời hay. Tôi muốn nói thêm rằng đây có lẽ là dạng đường cú pháp vô nghĩa nhất mà tôi từng thấy trong JS. '(0,)()' là chính xác cùng độ dài với '.call()', do đó, không có tiết kiệm byte trừ khi bạn loại bỏ dấu cách sau dấu phẩy (và thậm chí sau đó nó chỉ là một). Với chi phí gây nhầm lẫn cho các nhà phát triển không ngờ, nó thực sự không có giá trị khi sử dụng cú pháp như thế này. –

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