Tôi không thể hiểu rõ 3 quy tắc đó trong thông số kỹ thuật - hy vọng sẽ có một thứ tiếng Anh đơn giản hơn - nhưng đây là những gì tôi thu thập được từ JavaScript: The Definitive Guide, 4th Edition, David Flanagan, O'Reilly, 2011:
Trích dẫn:
JavaScript không coi mỗi ngắt dòng là dấu chấm phẩy: nó thường coi ngắt dòng là dấu chấm phẩy chỉ khi nó không thể phân tích mã mà không có dấu chấm phẩy.
Một trích dẫn khác: cho mã
var a
a
=
3 console.log(a)
JavaScript không coi ngắt dòng thứ hai là dấu chấm phẩy vì nó có thể tiếp tục phân tích cú pháp câu lệnh dài hơn a = 3;
và:
hai trường hợp ngoại lệ cho quy tắc chung rằng JavaScript diễn giải dòng bị phá vỡ dưới dạng dấu chấm phẩy khi nó không thể phân tích dòng thứ hai dưới dạng tiếp tục của câu lệnh trên dòng đầu tiên. Ngoại lệ đầu tiên liên quan đến các tuyên bố trả lại, phá vỡ và tiếp tục
... Nếu ngắt dòng xuất hiện sau bất kỳ từ nào trong số này ... JavaScript sẽ luôn diễn giải ngắt dòng đó là dấu chấm phẩy.
... Ngoại lệ thứ hai liên quan đến các toán tử ++ và ... ... Nếu bạn muốn sử dụng một trong hai toán tử này làm toán tử hậu tố, chúng phải xuất hiện trên cùng một dòng với biểu thức mà chúng áp dụng. Mặt khác, ngắt dòng sẽ được coi là dấu chấm phẩy và ++ hoặc - sẽ được phân tích cú pháp dưới dạng toán tử tiền tố được áp dụng cho mã theo sau. Hãy xem xét mã này, ví dụ:
x
++
y
Nó được phân tích cú pháp như x; ++y;
, không phải làx++; y
Vì vậy, tôi nghĩ để đơn giản hóa nó, có nghĩa là:
Nói chung, JavaScript sẽ đối xử với nó như là sự tiếp nối của mã miễn là nó làm cho tinh thần - ngoại trừ 2 trường hợp: (1) sau khi một số từ khóa thích return
, break
, continue
, và (2) nếu nó thấy ++
hoặc --
trên một dòng mới, sau đó nó sẽ thêm các ;
vào cuối dòng trước đó.
Phần về "coi nó là sự tiếp tục của mã miễn là nó có ý nghĩa" làm cho nó có cảm giác như sự phù hợp tham lam của biểu thức chính quy.
Như đã nói ở trên, điều đó có nghĩa là return
với ngắt dòng, trình thông dịch JavaScript sẽ chèn một;
(được trích dẫn lại: Nếu ngắt dòng xuất hiện sau bất kỳ từ nào trong số những từ này [chẳng hạn như return
] ... JavaScript sẽ luôn diễn giải ngắt dòng đó là dấu chấm phẩy)
và vì lý do này, ví dụ kinh điển của
return
{
foo: 1
}
sẽ không hoạt động như mong đợi, bởi vì trình thông dịch JavaScript sẽ coi nó là:
return; // returning nothing
{
foo: 1
}
Không được ngắt dòng ngay sau return
:
return {
foo: 1
}
cho nó hoạt động đúng. Và bạn có thể tự chèn ;
nếu bạn tuân theo quy tắc sử dụng ;
sau bất kỳ câu lệnh nào:
return {
foo: 1
};