Tại sao tôi nên sử dụng dấu chấm phẩy sau mỗi chức năng trong javascript?


282

Tôi đã thấy các nhà phát triển khác nhau bao gồm dấu chấm phẩy sau các chức năng trong javascript và một số thì không. Đó là thực hành tốt nhất?

function weLikeSemiColons(arg) {
   // bunch of code
};

hoặc là

function unnecessary(arg) {
  // bunch of code
}

Câu trả lời:


424

Dấu chấm phẩy sau khi khai báo hàmkhông cần thiết .

Ngữ pháp của a FunctionDeclarationđược mô tả trong đặc tả như sau:

function Identifier ( FormalParameterListopt ) { FunctionBody }

Không có dấu chấm phẩy yêu cầu về mặt ngữ pháp, nhưng có thể tự hỏi tại sao?

Dấu chấm phẩy dùng để phân tách các câu lệnh với nhau vàFunctionDeclaration không phải là một câu lệnh .

FunctionDeclarationsđược đánh giá trước khi mã đi vào thực thi, cẩu là một từ phổ biến được sử dụng để giải thích hành vi này.

Các thuật ngữ "khai báo hàm" và "tuyên bố hàm" thường được sử dụng sai thay thế cho nhau, bởi vì không có câu lệnh hàm nào được mô tả trong Đặc tả ECMAScript, tuy nhiên có một số cách triển khai bao gồm một câu lệnh hàm trong ngữ pháp của chúng, đặc biệt là Mozilla- nhưng một lần nữa là không chuẩn.

Tuy nhiên, dấu chấm phẩy luôn được khuyến nghị ở nơi bạn sử dụng FunctionExpressions, ví dụ:

var myFn = function () {
  //...
};

(function () {
  //...
})();

Nếu bạn bỏ qua dấu chấm phẩy sau hàm đầu tiên trong ví dụ trên, bạn sẽ nhận được kết quả hoàn toàn không mong muốn:

var myFn = function () {
  alert("Surprise!");
} // <-- No semicolon!

(function () {
  //...
})();

Hàm đầu tiên sẽ được thực thi ngay lập tức, vì các dấu ngoặc đơn bao quanh hàm thứ hai, sẽ được hiểu là Arguments lệnh gọi hàm.

Bài giảng khuyến nghị:


2
Được chỉnh sửa để làm rõ, bài báo đó nói về các biểu thức chức năng
CMS

1
Không hoàn toàn quen thuộc với ECMA, nhưng đó cũng là tiêu chuẩn tôi sử dụng. Bài đăng tốt. Hầu hết các tuts tôi thấy trực tuyến và các mẫu mã tôi DL đều sử dụng tiêu chuẩn đó, vì vậy tôi chỉ thích nghi với nó.
regex

1
Một số nhầm lẫn ở đây có thể bị ảnh hưởng do thiếu một từ tiếng Anh tốt cho "được phép vì nó sẽ bị bỏ qua". Chúng tôi không nói "không bắt buộc", nhưng điều đó gây hiểu lầm vì điều đó cho thấy rằng không bao gồm dấu chấm phẩy sau khi một tuyên bố thuộc cùng loại với không bao gồm dấu chấm phẩy sau một tuyên bố. Cái sau là tùy chọn theo một nghĩa hoàn toàn khác: đó là bởi vì trình phân tích cú pháp sẽ thêm dấu chấm phẩy bị thiếu mà bạn đã bỏ qua , trong trường hợp này, đó là vì trình phân tích cú pháp sẽ bỏ qua dấu chấm phẩy mà bạn đưa vào . Nói cách khác: nếu một là tùy chọn, thì tám cũng vậy .
Dấu chấm phẩy

Hiện tại, liên kết "Các biểu thức chức năng được đặt tên bị khử" liên kết đến một url chết, kho lưu trữ web có một bản sao ở đây: web.archive.org/web/20100426173335/http://yura.thinkweb2.com/
Tony

Ví dụ cuối cùng là một ví dụ tuyệt vời. Việc bỏ dấu chấm phẩy trong trường hợp này dẫn đến các lỗi cực kỳ lạ và khó gỡ lỗi. Toàn tâm toàn ý bỏ phiếu.
Yan Yankowski

38

Tôi sử dụng chúng sau khi khai báo hàm như biến:

var f = function() { ... };

nhưng không theo định nghĩa kiểu cổ điển:

function f() {
    ...
}

NetBeans, cũng như các IDE khác muốn xem dấu chấm phẩy sau một biến có chức năng như this.animaton_fun = function () {...};
Lance Cleveland

6
Nhưng - đối với người hỏi - tại sao ?
Luke

Nó giúp trong bước xây dựng. Khi tập lệnh uglifier nhìn thấy dấu chấm phẩy, nó không cần thêm ngắt dòng vào tệp đầu ra, nếu không, ngắt dòng sẽ được tạo và tệp sẽ lớn hơn một chút.
autoboxer

20

JS Lint là quy ước thực tế và nó nói không có dấu chấm phẩy sau chức năng cơ thể. Xem phần "Dấu chấm phẩy" .


10
Tôi đã chứng kiến ​​tận mắt một chức năng thất bại vì thiếu dấu chấm phẩy. Tôi hoàn toàn không đồng ý rằng bỏ nó đi là một quy ước. Mặc dù 99,99% thời gian nó sẽ không bị hỏng, nhưng có một số tình huống mà tôi nhận thấy IE đã không thể can thiệp vào JavaScript mà không có dấu chấm phẩy.
MillsJROSS

8
Câu trả lời của tôi chỉ liên quan đến các định nghĩa hàm như trong hai ví dụ của câu hỏi. Trong những trường hợp này, một dấu chấm phẩy chấm dứt là không cần thiết trong bất kỳ trình duyệt nào , trong mọi tình huống. Tôi đoán bạn có thể nghĩ về các biểu thức chức năng. Chúng là một vấn đề hoàn toàn khác, và không phải là vấn đề được đề cập trong câu hỏi ban đầu.
David Hedlund

var myFunction = function (arg) {console.log (arg); } (function () {console.log ('hàm hoàn toàn không liên quan'); return 'xem điều gì xảy ra';} ());
Maciej Krawchot

@MillsJROSS Tôi phản hồi lần thứ hai của David, và sẽ rất vui nếu bạn giải thích được sự thất bại mà bạn gặp phải. Đây thực sự là một biểu hiện chức năng hay lỗi của IE?
wlnirvana

7

Chỉ cần kiên định! Chúng không cần thiết, nhưng cá nhân tôi sử dụng chúng vì hầu hết các kỹ thuật thu nhỏ đều dựa vào dấu chấm phẩy (ví dụ: Packer ).


5

Thực sự chỉ phụ thuộc vào sở thích của bạn. Tôi thích kết thúc các dòng mã bằng dấu hai chấm vì tôi đã quen với Java, C ++, C #, v.v., vì vậy tôi sử dụng các tiêu chuẩn tương tự để mã hóa trong javascript.

Tôi thường không kết thúc khai báo hàm trong dấu hai chấm, nhưng đó chỉ là sở thích của tôi.

Các trình duyệt sẽ chạy theo bất kỳ cách nào, nhưng có thể một ngày nào đó họ sẽ đưa ra một số tiêu chuẩn khắt khe hơn về điều này.

Ví dụ về mã tôi sẽ viết:

function handleClickEvent(e)
{
     // comment
     var something = true;  // line of code
     if (something)  // code block
     {
        doSomething();  // function call
     }
}

1
dòng chắc chắn nên được chấm dứt bằng dấu chấm phẩy, tho. nếu không, một công cụ khai thác có thể phá vỡ hoàn toàn chức năng
David Hedlund

9
@david: trong trường hợp đó, công cụ khai thác bị hỏng, chắc chắn?
DisgruntledGoat

Đã đồng ý. Đó là một cách mã hóa tự nhiên cho những người (như tôi) đến từ nền tảng C / C ++. Nó cũng làm cho mã dễ đọc hơn.
Anshuman Manral

3

Nó thực sự còn hơn cả một vấn đề về quy ước hay tính nhất quán.

Tôi khá chắc chắn rằng không đặt dấu chấm phẩy sau mỗi câu lệnh làm chậm trình phân tích cú pháp nội bộ bởi vì nó phải tìm ra nơi kết thúc của câu lệnh. Tôi ước tôi có một số số tiện dụng để bạn xác nhận tích cực điều đó, nhưng có lẽ bạn có thể tự google nó. :)

Ngoài ra, khi bạn đang nén hoặc rút gọn mã, việc thiếu dấu hai chấm có thể dẫn đến một phiên bản rút gọn của tập lệnh không thực hiện được những gì bạn muốn vì tất cả khoảng trắng sẽ biến mất.


3
Câu hỏi được đặt ra nếu dấu chấm phẩy phải nằm sau các hàm chứ không phải mọi câu lệnh. Tôi đồng ý rằng bạn nên đặt dấu chấm phẩy sau mỗi câu lệnh và tôi đã thấy sự đồng thuận stackoverflow khác cũng nói như vậy.
macca1

1
Đồng ý và không đặt dấu chấm phẩy sau các hàm sẽ dẫn đến vấn đề thu nhỏ mà tôi đã đề cập. Chúc may mắn thưa ông.
Mason

Upvote 'nguyên nhân củng cố vấn đề thu nhỏ đã làm rõ sự hiểu biết của tôi
JackW327

1

Khi tôi rút gọn các tập lệnh của mình, tôi nhận ra rằng tôi cần sử dụng dấu chấm phẩy cho các hàm bắt đầu bằng dấu bằng. nếu bạn định nghĩa một hàm là var, vâng, bạn cần sử dụng dấu chấm phẩy.

cần dấu chấm phẩy

var x = function(){};
var x = new function(){};
this.x = function(){};

không cần dấu chấm phẩy

function x(){}

0

ĐƠN GIẢN:

Đó là một thực hành tốt để rời khỏi dấu chấm phẩy ;sau khi kết thúc niềng răng chức năng. Họ đã được coi là một thực hành tốt nhất trong nhiều năm.

Một lợi thế của việc luôn sử dụng chúng là nếu bạn muốn thu nhỏ JavaScript của mình.

Khi thu nhỏ Javascript, giúp giảm kích thước tệp một chút.

Nhưng đối với thực tiễn tốt nhất và câu trả lời ở trên, không nên sử dụng nó sau một thẻ chức năng.

Nếu bạn không sử dụng dấu chấm phẩy và nếu bạn muốn thu nhỏ (như rất nhiều nhà phát triển muốn làm nếu trang web của họ phục vụ nhiều JavaScript), bạn có thể nhận được tất cả các loại Lỗi / Cảnh báo.


0

dấu chấm phẩy sau một chức năng không cần thiết sử dụng nó hay không, không gây ra lỗi trong chương trình của bạn. tuy nhiên, nếu bạn có kế hoạch thu nhỏ mã của mình, thì sử dụng dấu chấm phẩy sau các hàm là một ý tưởng tốt. nói ví dụ bạn có mã như bên dưới

//file one
var one=1;
var two=2;
function tryOne(){}
function trytwo(){}

//file two
var one=1;
var two=2;
function tryOne(){};
function trytwo(){};

Khi bạn thu nhỏ cả hai, bạn sẽ nhận được như sau

Lưu ý rằng các ý kiến ​​chỉ dành cho ilustration

//file one
var one=1;var two=2;function tryOne(){}
function trytwo(){}

//file two
var one=1;var two=2;function tryOne(){};function trytwo(){};
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.