2010-09-15 25 views
6

Trong Javascript đôi khi tôi thấy một dòng dài của mã chia tay tại một ) như thế này (example):

function() 
{ 

hay như thế này (example):

object.methodOne() 
     .methodTwo(); 

Nhưng khi đọc line break expectations for jsLint, nó nói:

Là một quốc phòng tiếp tục chống lại cơ chế chèn dấu chấm phẩy, JSLint hy vọng báo cáo dài để được chia chỉ sau khi một trong các ký tự dấu hoặc khai thác:

, ; : { } ([ = < > ? ! + - */% ~^| & 
== != <= >= += -= *= /= %= ^= |= &= << >> || && 
=== !== <<= >>= >>> >>>= 

JSLint không mong đợi thấy một tuyên bố dài bị hỏng sau mã định danh, chuỗi, số, gần hơn hoặc toán tử hậu tố:

.) ] ++ -- 

Vì vậy, dấu ngoặc đơn đóng được tách ra thành bộ ngắt dòng mà JSLint "không mong đợi để xem".

Tôi muốn sử dụng

function() 
{ 

kể từ khi tôi tìm thấy nó dễ đọc hơn, và tôi đã sử dụng nó trong các ngôn ngữ khác, nhưng hiện tại tôi sử dụng:

function() { 

thể tôi một cách an toàn sử dụng ) để chia hàng dài?

+0

Lưu ý rằng jslint cố ý phòng thủ hơn cú pháp JS thực, và nó sẽ khiếu nại về những thứ có giá trị Javascript (ví dụ, jslint coi '+ +' và '--' là xấu). –

+0

@ Daniel - Tôi hiểu điều đó, nhưng tôi cho rằng vẫn còn có lý do cho các quy tắc ... Tôi chỉ không chắc chắn những gì họ có thể được trong trường hợp của paren gần. –

+1

Mặc dù định nghĩa hàm là 100% an toàn, có những trường hợp khác (xem câu trả lời của người dùng166390) trong đó một ')' ở cuối có thể gây ra vấn đề. – casablanca

Trả lời

4

Liên kết này nên giải thích tất cả:

JavaScript Semicolon Insertion

Các "nguy hiểm" là có (lấy từ liên kết ở trên, nhấn mạnh thêm):

Có năm các sản phẩm bị hạn chế trong ngữ pháp, chúng là các toán tử postfix ++ và -, tiếp tục báo cáo, vi phạm các tuyên bố, trả lại câu lệnh và ném tuyên bố.

function() không có trong danh sách "nguy hiểm" đó. Tuy nhiên, khi viết mã bán tự do (tôi không chắc đây có phải là mục tiêu của bạn không :-), bạn nên bảo vệ chống lại các dòng bắt đầu bằng các ký tự - chẳng hạn như ( hoặc [ - có thể bắt đầu hoặc tiếp tục biểu hiện. Các mã sau đây cho thấy một ví dụ về mã đó là khả năng sai:

x() 
(function(){...})() 

Như bạn thấy, sử dụng ) như một dòng máy cắt có thể làm cho sự biểu hiện có thể tiếp tục trên tinh tế không có bán rõ ràng colon iff dòng kế tiếp có thể tiếp tục biểu thức. Tôi viết những tiến trình như (nếu sau thực sự là mục đích):

x() 
;(function(){...})() 

Cá nhân, tôi không thích JSLint :-) Chúc mừng mã hóa.

2

Khi bạn đang cố gắng để trả lại một đối tượng,

return { 
'foo': 'bar' 
} 

sẽ trả lại đối tượng, trong khi

return 
{ 
    'foo': 'bar' 
} 

sẽ trở lại undefined. Javascript sẽ tự động chèn dấu chấm phẩy sau return trong ví dụ thứ hai và đối tượng sẽ không bao giờ được tiếp cận.

Đối với các chức năng, bởi vì function() không hợp lệ, nó sẽ không tạo sự khác biệt nếu dấu ngoặc nằm trên cùng một dòng hoặc tiếp theo.

Xem thêm phần 7.9.1 Rules of Automatic Semicolon Insertion của đặc tả ECMAScript. Ngoài số return, có bốn trường hợp khác mà dấu chấm phẩy sẽ được chèn do một dòng mới: break, continue, throw++ hoặc --.

Khi một continue, break, return, hoặc throw token được gặp và LineTerminator đang gặp phải trước khi thẻ tiếp theo, một dấu chấm phẩy được tự động chèn vào sau khi continue, break, return, hoặc throw token.

+0

Vì vậy, bạn đang nói rằng một ngắt dòng sau khi 'function()' hoặc 'object.method()' không bao giờ có thể chèn một dấu chấm phẩy trước hàng tiếp theo tiếp theo? –

+0

Đối với 'function()', JS không nên chèn dấu chấm phẩy. Đối với 'object.method()', tôi không tin nó sẽ chèn một dấu chấm phẩy nếu có một dòng mới trước khi các cuộc gọi phương thức xích khác (từ thử nghiệm và kinh nghiệm), nhưng tôi không phải 100% trên những gì spec nằm trong tình huống này (vì 'object.method()' là cú pháp hợp lệ). –

+0

Cảm ơn. Trong thực tế, tôi chưa bao giờ gặp vấn đề với những loại ngắt dòng đó, nhưng tôi luôn hoang tưởng rằng có một số trình duyệt không thể giải thích mã của tôi một cách chính xác vì nó, hoặc có trường hợp góc nào đó tôi sẽ chạy vào ... –

0

Nó an toàn.

Tôi đã xem nhanh các quy tắc chèn dấu chấm phẩy trong thông số kỹ thuật (ấn bản thứ 3) và để khai báo hàm là OK.

+0

Xem phần 7.9.1. Có năm tình huống mà chèn một dòng mới sẽ gây ra một dấu chấm phẩy được chèn vào nơi nó không được mong muốn. –

+0

Tôi đã đề cập đến các khai báo hàm. hàm x() LINE_BREAK {là OK. Cũng đúng đối với các biểu thức hàm. –

3

Dấu chấm phẩy sẽ được chèn chỉ khi dòng sau không phải là tiếp tục hợp lệ của dòng trước đó (xem ngoại lệ bên dưới). Vì vậy, function() { với { trên dòng tiếp theo luôn an toàn.

Từ spec ECMAScript:

Khi nào, như các chương trình được phân tách từ trái sang phải, một thẻ (gọi là vi phạm token) là gặp phải mà không được phép của bất kỳ sản xuất của ngữ pháp, sau đó một dấu chấm phẩy tự động được chèn trước mã thông báo vi phạm nếu một hoặc nhiều điều kiện sau đây là đúng:

• Mã thông báo vi phạm được tách biệt với mã thông báo trước đó của ít nhất một LineTerminator.

• Mã thông báo vi phạm là}.

ngoại lệ đối với quy tắc này là các nhà khai thác tăng/giảm, continue, break, returnthrow, có lẽ phải luôn trên cùng một dòng:

Khi một ++ hoặc - mã thông báo là gặp phải khi trình phân tích cú pháp xử lý nó như một toán tử postfix, và ít nhất một LineTerminator đã xuất hiện giữa token trước và ++ hoặc - token, thì một dấu chấm phẩy được chèn tự động trước dấu ++ hoặc -.

Khi gặp phải mã thông báo tiếp tục, ngắt, trả lại hoặc ném và gặp phải một LineTerminator trước mã thông báo tiếp theo, dấu chấm phẩy tự động được chèn sau mã thông báo tiếp tục, ngắt, trả lại hoặc ném.

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