Giải thích về lỗi ngắt dòng của JSHint trước lỗi '+'


125

Ai đó có thể giải thích cho tôi tại sao JSHint phàn nàn về những điều sau đây không,

window.location.href = String1
    + '#'
    + Sting2
    + '='
    + String3;

Với lỗi Bad line breaking before '+' error

Tôi hiểu rằng lỗi này có thể được cấu hình với laxbreak tùy chọn , được mô tả là

Tùy chọn này ngăn chặn hầu hết các cảnh báo về việc ngắt dòng không an toàn trong mã của bạn. Nó không ngăn chặn các cảnh báo về kiểu mã hóa dấu phẩy đầu tiên. Để ngăn chặn những người bạn phải sử dụng laxcomma (xem bên dưới).

Lời giải thích này khá ngắn gọn và tôi tò mò về lý do tại sao việc ngắt dòng theo cách này được coi là xấu hoặc lỏng lẻo ngay từ đầu.

Hãy nhớ rằng tôi không cố bắt đầu một cuộc chiến thần thánh ở đây, tôi chỉ tìm kiếm một câu trả lời khách quan về lý do tại sao những người JSHint nghĩ rằng điều này là xấu, cho dù đó chỉ là một sở thích phong cách mà họ đang tiêm vào kẻ nói dối của họ (tôi nghĩ rằng JSLint là kẻ nói dối có ý kiến), hoặc nếu có điều gì đó có thể sai ở một số phiên dịch viên nhất định khi ngắt dòng theo cách này.


6
Tôi nghĩ rằng đó chỉ là "phong cách xấu" theo JSHint. Bạn sẽ nhận được hiệu ứng tương tự nếu bạn sử dụng dấu phẩy hàng đầu. Để dễ đọc, ít nhất tôi sẽ viết lại nó bằng dấu + ở cuối dòng.
Iwan

28
Bummer. Tôi nghĩ rằng phong cách này hoàn toàn là phong cách dễ đọc nhất để sử dụng với các chuỗi nhiều dòng, đặc biệt là khi xem mã trong một cửa sổ hẹp.
Lambart

12
dẫn đầu với các mã thông báo tiếp tục tuyên bố giúp sắp xếp mọi thứ và thể hiện trực quan sự tiếp tục ở phần bên trái của khối mã, đó là nơi người ta mong đợi để tìm thấy các yếu tố cấu trúc, đặc biệt là nếu quét nhanh. Đó chắc chắn là khả thi và hợp lý và không, khách quan, phong cách xấu. Tuy nhiên, có một vấn đề toàn vẹn mã để thực thi quy tắc này, thật không may.
Adam Tolley

1
@AdamTcar Tôi hoàn toàn đồng ý, và khi tôi hỏi về điều này thì có vẻ như đó là xác nhận rằng đây là FUD. Nó đã được xem xét kỹ lưỡng sau khi "hiệu ứng meta"; và sự xem xét kỹ lưỡng đó dường như xác nhận điều này là khả thi và hợp lý.
HostileFork nói không tin tưởng SE

2
Ngày nay ( JSHint 2.9.4 ) thông báo lỗi là ngắt dòng sai trước '+'; độc giả có thể giải thích điều này như là một ranh giới biểu hiện.
Tê giác

Câu trả lời:


107

Đó là một hướng dẫn phong cách để tránh các tuyên bố thể chịu trách nhiệm với các giả định về việc chèn dấu chấm phẩy tự động .

Ý tưởng là bạn làm cho nó rõ ràng ở cuối dòng cho dù biểu thức kết thúc ở đó hay có thể được tiếp tục trên dòng tiếp theo.


6
Cảm ơn câu trả lời, có một lý do đằng sau lỗi giúp tôi dễ dàng biện minh cho việc thực hiện các thay đổi để xoa dịu JSHint.
James McMahon

36
Tự động chèn dấu chấm phẩy là một lý do hợp lý cho phong cách này được thi hành. Nhưng khi biểu thức nằm trong dấu ngoặc đơn, cảnh báo vẫn tồn tại. Và điều đó làm cho tôi buồn.
Ben Hyde

23
thứ hai @BenHyde, và nói chung, nó dễ đọc hơn cho con người khi lướt qua mã để dẫn dòng với a +. Mắt dễ dàng hơn (và ít bị lỗi hơn) khi đi theo một cột duy nhất bên trái hơn là nhảy đến cuối mỗi dòng để xem liệu nó có được nối tiếp bởi dòng tiếp theo không. ngay cả ngữ pháp cũng ít lộn xộn hơn: "Dòng 118 nối thêm 117" so với "Dòng 117 sẽ được nối thêm bởi dòng 118".
worc

9
Cá nhân, tôi ghét việc thêm các toán tử (và dấu phẩy) vào cuối dòng vì tôi lướt qua nó. Tôi dễ dàng đọc logic hơn trong các câu lệnh boolean nhiều dòng (&& hoặc || ở đầu một dòng thay vì ở cuối dòng) và tôi có thể nhanh chóng phân biệt các danh sách được phân tách bằng dấu phẩy ngoài các câu lệnh nhiều dòng khác bằng cách bắt đầu chúng bằng một dấu phẩy Cảm ơn chúa vì sự lỏng lẻo
aaaaaa

2
@Barney Làm thế nào để bạn giải quyết mối quan tâm về việc chèn dấu chấm phẩy tự động với các câu trả lời cho câu hỏi rất giống nhau của tôi ? Rủi ro chính đáng của định dạng này là gì? Đối với tôi nó có lợi thế về khả năng có thể quét được.
HostileFork nói không tin tưởng SE

8

Jshint sẽ không gắn cờ này là ngắt dòng xấu nếu bạn sử dụng dấu + trước khi ngắt dòng trái ngược với dòng mới. Thích như vậy:

window.location.href = String1 +
'#' +
Sting2 +
'=' +
String3;

10
Điều này không trả lời câu hỏi ngay cả một iota. Tại sao rất nhiều phiếu bầu?
Lambart

4
Có lẽ nhưng đây là một cách để khắc phục vấn đề này mà không phải thay đổi cài đặt jshint của bạn.
asulaiman

4
Đây phải là một nhận xét vì nó không thực sự trả lời câu hỏi nhưng cung cấp thông tin có giá trị.
tomtomssi

3

Không phải là câu trả lời trực tiếp cho câu hỏi nhưng đối với bất kỳ ai bắt gặp điều này từ Googling (như tôi đã làm), những người muốn giữ nguyên tắc nhưng sửa các cảnh báo, những điều sau đây có thể hữu ích ...

Khi sử dụng Notepad ++ (ví dụ với plugin JSLint), điều này có thể được khắc phục bằng cách sử dụng tìm kiếm & thay thế sau đây:

  • Tìm cái gì: (\r\n|\n|\r)( *)\+
  • Thay thế bằng: (bao gồm không gian đầu tiên và cuối cùng) +$1$2 
  • Chế độ tìm kiếm: Biểu thức thông thường

(Chỉ được thử nghiệm trên Windows nhưng regex cũng sẽ hoạt động với các kết thúc dòng Unix hoặc Mac OS.)

Để làm được một điều tương tự cho ||, &&, ==, !=, <=hoặc >=thay vì +, sử dụng này:

  • Tìm cái gì: (\r\n|\n|\r)( *)(\|\||&&|==|!=|<=|>=)
  • Thay thế bằng: (bao gồm không gian đầu tiên và cuối cùng) $3$1 $2 

5
Hữu ích, có lẽ, cho những người muốn thay đổi định dạng của họ. Nhưng nó hoàn toàn không trả lời được câu hỏi (ngụ ý): "Tôi tò mò về lý do tại sao việc ngắt dòng theo cách này được coi là xấu hoặc lỏng lẻo ngay từ đầu."
Lambart

Điểm công bằng, đã thêm một ghi chú ở đầu giải thích lý do tại sao tôi đăng bài này.
Steve Chambers
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.