Dấu chấm phẩy sau khai báo chức năng là khô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:
Đã chỉnh sửa để làm rõ, bài viết đó nói về ** biểu thức chức năng ** – CMS
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
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