2012-04-23 38 views
56

thể trùng lặp:
Javascript syntax: what comma means?trở lại tuyên bố với nhiều dấu phẩy tách giá trị

gì mẫu trở lại này? Làm thế nào nó hoạt động?

return myfunc(), myobj.myvar = someobj.prop, myobj

tôi đã không đi qua mô hình này trước đây nhưng đã được nhìn vào Bing Maps Ajax Control và đã nhận thấy mô hình này nhiều lần.

Vì tôi hiểu rằng nhiều giá trị không được trả lại. Vậy mô hình này làm gì? Những gì được trả lại? Lợi ích của mẫu này là gì?

+0

Liệu nó trả về một tập các đối; như thế nào bạn có thể quá tải các tham số trong một cuộc gọi chức năng? –

+1

"Mẫu này có lợi gì?" - Nó không có. Nó là khó hiểu, mã không thành ngữ. – Quentin

+0

Tôi không thể thấy bất kỳ lý do gì ... Nó thậm chí còn đặt nhiều vật thể lên chồng hơn là có ba hướng dẫn thông thường ... –

Trả lời

100

Đó là comma operator. Nó chạy một loạt các biểu thức, theo thứ tự, và sau đó trả về kết quả của số cuối cùng của chúng. Chính xác như:

myfunc(); 
myobj.myvar = someobj.prop; 
return myobj; 

Một số người thực sự thích làm những việc trên một dòng, ngay cả khi không có lý do khách quan. Không có lợi ích trong ví dụ bạn đưa ra, và trong thực tế nó gây nhầm lẫn bởi vì nó làm cho nó trông giống như hai bit đầu tiên liên quan đến giá trị mà cuối cùng sẽ được trả lại, mà họ không.(tôi đã viết rằng trước khi bạn nói với chúng tôi nó đã được minified mã; rõ ràng, không rõ ràng cho con người chỉ là một vấn đề trong mã nguồn, không minified mã.)

Vì bạn đã nói đó là một minifier: Các rất nhỏ lợi ích có thể có của bộ khai thác có thể nhận được ở đây là nếu đây là một phần của khối điều kiện: Nó có thể lưu một hoặc hai ký tự. Nếu chúng ta giả dạng dài trông như thế này:

if (someCondition) { 
    myfunc(); 
    myobj.myvar = someobj.prop; 
    return myobj; 
} 

... sử dụng toán tử dấu phẩy, các minifier thể làm điều này (63 ký tự):

if(someCondition)return myfunc(),myobj.myvar=someobj.prop,myobj 

... chứ không phải này (65 ký tự):

if(someCondition){myfunc();myobj.myvar=someobj.prop;return myobj} 

... mà không thay đổi các chức năng của mã này, nếu những gì sau là một } hoặc một số nhân vật thích hợp khác (hoặc end-of -file) để kích hoạt automatic semicolon insertion ở cuối. Nếu không, nó sẽ cần ; trên cái đầu tiên, nhưng điều đó vẫn tiết kiệm một ký tự.

+11

+1 (Tôi vừa học một điều mới) – MilkyWayJoe

+3

Điều tồi tệ hơn là bạn có thể đặt tất cả những thứ đó trên một dòng. Sử dụng một ',' thay vì một ';' chỉ cho phép câu lệnh 'return' đi ở phía trước, nơi nó sẽ gây nhầm lẫn cho người bảo trì. – Quentin

+0

@Quentin: Khá. –

8

Đánh giá comma operator (từ trái sang phải) biểu thức và sau đó nó trả về kết quả cuối cùng, trong trường hợp này sẽ là đánh giá số nhận dạng myobj.

Bạn có thể làm điều này loại bỏ một số dấu ngoặc nhọn nếu đó là quan trọng với bạn ...

if (true) 
    ;// do something 
else 
    return myfunc(), myobj.myvar = someobj.prop, myobj 

... như trái ngược với ...

if (true) 
    ;// do something 
else { 
    myfunc(); 
    myobj.myvar = someobj.prop; 
    return myobj; 
} 
1

trong ví dụ của bạn myObj nên được trả lại nơi như tất cả mọi thứ trước khi bị hành quyết

myfunc(); 
myobj.myvar = someobj.prop; 
return myobj; 
Các vấn đề liên quan