2012-07-18 38 views
5

Chỉ cần kiểm tra mã JavaScript của Google và tôi đã tìm thấy cú pháp sau:Javascript cú pháp (0, fn) (args)

var myVar = function...; 
(0, myVar)(args); 

Bạn có biết ý nghĩa của cú pháp này? Tôi không thể tìm thấy sự khác biệt giữa (0, myVar)(args);myVar(args);.

Để đưa ra một ví dụ chính xác, chúng tôi có

_.x3 = function (a, b) { 
    return new _.q3(20 * b.x + a.B.B.x, 20 * b.y + a.B.B.y) 
}; 

Và sau

this.ta = new _.s3((0, _.x3)(this.fa, this.B.B), 0); 
+0

trùng lặp có thể xảy ra [javascript dấu phẩy hành] (http://stackoverflow.com/questions/5580596/javascript-comma-operator) –

+0

Out of tò mò, có thể giúp bạn gửi nhiều bối cảnh của nơi này xuất hiện? – Austin

+0

Tôi đã kiểm tra mã của https://www.google.fr/xjs/_/js/s/sy46,zr/rt=j/ver=-wnZQEUYm8E.en_US./d=0/rs=AItRSTNMBUOhWluxPqsKFY9CVTnMlxNz6w – korko

Trả lời

0

Nhà điều hành dấu phẩy trả về giá trị của toán hạng cuối cùng, vì vậy giá trị của 0, myVar cũng giống như giá trị của myVar. Giá trị của toán hạng đầu tiên được đánh giá, nhưng trong trường hợp này nó tất nhiên không thực hiện bất cứ điều gì.

Nhà điều hành dấu phẩy được sử dụng đôi khi các toán hạng đầu tiên thực sự làm điều gì đó, giống như initialising hai biến trong một vòng lặp:

for (i = 0, j = 42; i < 10; i++, j--) ... 
+0

Vâng tôi biết rằng, nhưng lý do thực sự là lợi ích của điều này (0, fn) là gì? Nếu bạn biết gì? Có lẽ nó chỉ là một số giữ chỗ cho các trường hợp cụ thể nhưng tôi không nghĩ rằng google sẽ thêm các ký tự vô dụng trong js của họ. – korko

+1

@korko: Không có lý do thực tế nào cho cấu trúc đó, do đó, đó là sự hiểu lầm hoặc cố gắng làm xáo trộn mã. – Guffa

+0

Tôi không nghĩ Google là sự hiểu lầm javascript: D Vì vậy, có thể làm xáo trộn nhưng tôi không nghĩ gì cả, nó chỉ thêm một số ký tự trong khi Google luôn cố gắng xóa các ký tự vô dụng để giảm kích thước tệp. – korko

3

Cú pháp này được sử dụng toán tử dấu phẩy, ,. Nó đánh giá tất cả các toán hạng của nó và trả về giá trị của giá trị cuối cùng. Trong trường hợp này, 0 chỉ được sử dụng như một trình giữ chỗ để (0, function() {}) sẽ trả lại (function() {}). Sau khi được đánh giá, phần (args) đang gọi hàm và đưa ra các đối số của nó.

Chỉnh sửa sau khi bình luận:

Lý do người ta sẽ sử dụng phong cách này của mã hóa là để họ có thể thực thi mã một cách nhanh chóng hoặc trên cùng một dòng. Dưới đây là một ví dụ:

var a = 0, 
    b = 1, 
    c; 

c = (a++, b++, a + 2); // a is added, b is added, and a is added then returned 

a; // 1 
b; // 2 
c; // 3 
+0

Vâng, hoàn toàn là một lý do tốt nhưng ... 0 có nghĩa là không có gì. Có một số loại bảo vệ, descoping hoặc một cái gì đó cho một ý nghĩa cho (0, fn)() thay vì chỉ fn(). – korko

+0

Xin lỗi, nhưng tôi không thể nghĩ ra. Tôi chắc chắn có một lý do mặc dù nếu Google sử dụng nó. – 0x499602D2

+0

Dù sao, cảm ơn câu trả lời của bạn, đó là một điều tốt để biết;) – korko

1

Tôi có cùng một câu hỏi và sau đó tìm thấy câu trả lời, như sau:

Nó thực sự là dành cho

(0, foo.fn)(); 

Hãy nhớ rằng trong JavaScript, khi foo.fn() được gọi , sau đó bên trong của fn, this bị ràng buộc với foo. Nếu bạn sử dụng

var g = foo.fn; 
g(); 

sau đó khi g được gọi trên, this được ràng buộc với đối tượng toàn cầu (window, trong bối cảnh của một trình duyệt web).

Vì vậy, bạn có cần xác định g như ở trên không? Bạn có thể làm điều gì đó chẳng hạn như

(foo.fn)(); 

Câu trả lời là không. JavaScript sẽ xử lý nó giống như foo.fn(); vì nó chỉ là foo.fn với dư thừa () có thể bị xóa.

Nhưng có một cách để có được xung quanh, và nó là chính xác để sử dụng the comma operator, which Mozilla stated as

Nhà điều hành dấu phẩy đánh giá mỗi toán hạng của nó (từ trái sang phải) và trả về giá trị của toán hạng cuối cùng

Vì vậy, sử dụng

(0, foo.fn)(); 

các (0, foo.fn) sẽ được đánh giá để một tham chiếu đến chức năng, Lik e g ở trên, và sau đó hàm được gọi. Và sau đó, this không bị ràng buộc với foo nhưng bị ràng buộc với đối tượng chung.

Vì vậy, mã được viết theo cách này, là "cắt liên kết".

Ví dụ:

var foo = { 
       fullName: "Peter", 
       sayName: function() { console.log("My name is", this.fullName); } 
      }; 

window.fullName = "Shiny"; 

foo.sayName();  // My name is Peter 

(foo.sayName)();  // My name is Peter 

(0, foo.sayName)(); // My name is Shiny 
Các vấn đề liên quan