2009-12-02 42 views

Trả lời

373

Dấu chấm phẩy sau khai báo chức năngkhông cần thiết.

Ngữ pháp của một FunctionDeclaration được mô tả trong the specification như thế này:

function Identifier (FormalParameterListopt) { FunctionBody } 

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

dấu chấm phẩy dùng để tách báo cáo lẫn nhau, và một FunctionDeclaration không phải là một tuyên bố .

FunctionDeclarations được đánh giá trước mã đi vào thực hiện, hoisting là một từ chung dùng để giải thích hành vi này.

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

Tuy nhiên phẩy luôn khuyến cáo nơi bạn sử dụng FunctionExpressions, ví dụ:

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

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

Nếu bạn bỏ qua các dấu chấm phẩy sau khi chức năng đầ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() { 
    //... 
})(); 

Chức năng đầu tiên sẽ được thực hiện ngay lập tức, vì các dấu ngoặc đơn xung quanh chữ cái thứ hai, sẽ được hiểu là Arguments của một cuộc gọi hàm.

bài giảng Khuyến cáo:

+2

Đã chỉnh sửa để làm rõ, bài viết đó nói về ** 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 tốt. Hầu hết các tuts tôi thấy trực tuyến và mã mẫu tôi DL sử dụng tiêu chuẩn đó, vì vậy tôi đã chỉ thích nghi với nó. – regex

+1

Một số sự nhầm lẫn ở đây có thể bị ảnh hưởng bởi việc thiếu một từ tiếng Anh tốt cho "được phép vì nó sẽ bị bỏ qua". Chúng tôi rơi trở lại nói rằng "tùy chọn", nhưng điều đó gây hiểu lầm vì nó cho thấy rằng không bao gồm dấu chấm phẩy sau khi tuyên bố thuộc cùng một danh mục không bao gồm dấu chấm phẩy sau một tuyên bố. Tùy chọn thứ hai là tùy chọn theo nghĩa hoàn toàn khác: đó là 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 bạn đã bao gồm *. Để đặt nó theo một cách khác: nếu một là tùy chọn, vì vậy là * tám *. – Semicolon

7

Chỉ cần ở lại phù hợp! Chúng không cần thiết, nhưng cá nhân tôi sử dụng chúng bởi vì hầu hết các kỹ thuật rút gọn dựa vào dấu chấm phẩy (ví dụ, Packer).

4

Thực sự chỉ phụ thuộc vào tùy chọn của bạn. Tôi thích kết thúc các dòng mã với dấu chấm phẩy 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ự cho mã hóa trong javascript.

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

Trình duyệt sẽ chạy theo cách này, 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ề việc 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 phải được chấm dứt bằng dấu chấm phẩy, tho. nếu không một thợ mỏ hóa học có thể phá vỡ chức năng hoàn toàn –

+8

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

20

JS Lint là ước de-facto, và nó nói không có dấu chấm phẩy sau khi cơ quan chức năng. Xem phần "Dấu chấm phẩy".

+9

Tôi đã chứng kiến ​​tay đầu tiên 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ó ra là một quy ước. Trong khi 99,99% thời gian nó sẽ không phá vỡ, có một số tình huống mà tôi đã nhận thấy IE đã không thể interpet JavaScript mà không có dấu chấm phẩy. – MillsJROSS

+7

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

+0

var myFunction = function (arg) {console.log (arg); } (function() { console.log ('chức năng hoàn toàn không liên quan'); trả về 'xem điều gì xảy ra'; }()); –

32

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() { 
    ... 
} 
+0

NetBeans, cũng như các IDE khác muốn xem dấu chấm phẩy sau một hàm-as-biến như this.animaton_fun = function() {...}; –

+5

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

+0

nó giúp trong quá trình xây dựng bước. Khi một tập lệnh uglifier 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

3

Đó thực sự là vấn đề về quy ước hoặc nhất quán.

Tôi khá chắc chắn rằng không phải là đặ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ộ vì nó phải tìm ra điểm kết thúc của câu lệnh là gì. Tôi muốn tôi có một số số tiện dụng để bạn khẳng định tích cực điều đó, nhưng có thể bạn có thể tự mình làm điều đó. :)

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 phiên bản rút gọn của tập lệnh không làm những gì bạn muốn vì tất cả khoảng trắng đều biến mất.

+3

Câu hỏi được hướng tới nếu dấu chấm phẩy phải sau các hàm, 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 tuyên bố, và tôi đã nhìn thấy sự đồng thuận stackoverflow khác nói như vậy. – macca1

+1

Đồng ý, và không đặt dấu chấm phẩy sau khi chức năng sẽ dẫn đến vấn đề giảm thiểu mà tôi đã đề cập. Chúc may mắn thưa ngài. – Mason

+0

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

1

Khi tôi rút gọn tập lệnh, tôi nhận ra rằng các hàm bắt đầu bằng dấu tôi cần sử dụng dấu chấm phẩy. nếu bạn định nghĩa một hàm là var, có 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 phẩy ; sau khi kết thúc niềng răng hàm. Họ đã được coi là một thực hành tốt nhất trong nhiều năm.

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

Khi rút gọn Javascript, giúp giảm kích thước tệp một chút.

Nếu bạn KHÔNG sử dụng dấu chấm phẩy và nếu bạn muốn rút gọn (giống như 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.

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