Trong nhiều cuốn sách là gì/blog posts tự gọi mô hình chức năng ẩn danh được viết như thế này:sự khác biệt giữa những người tự thực hiện chức năng ẩn danh (aka IIFE) thực hiện
(function() {
var foo = 'bar';
})();
Tuy nhiên chạy một JSLint về điều này mang lại cho này lỗi:
Move the invocation into the parens that contain the function.
ví dụ: thay đổi nó để làm việc này:
(function() {
var foo = 'bar';
}());
Câu hỏi
- Tại sao là việc thực hiện đầu tiên không đủ tốt cho JSLint? Sự khác biệt là gì?
- Biểu mẫu ưa thích là gì? JSLint có đúng không?
- Tại sao nó hoạt động? sau khi tất cả
function(){}()
némSyntaxError: Unexpected token (
Nhưng gói nó với parens làm cho nó tất cả của một công việc đột ngột? ví dụ. (function(){}()
) - hoạt động tốt
(Sau khi tất cả điều này là JavaScript, không Lisp, vì vậy những gì là hiệu ứng của gói Parens về lỗi cú pháp ohterwise?)
EDIT: đây là một phần của một followup này (tôi sẽ không nói chính xác mặc dù): JSLint error: "Move the invocation into the parens that contain the function", vì vậy câu hỏi chính của tôi là # 3, tại sao nó hoạt động ở tất cả?
Nhiều, nhiều bản sao. Tóm lại, 1-2: Bởi vì Crockford thích vậy. JSHint được tạo ra chỉ vì JSLint quá thiên vị. 3. Bởi vì định danh là tùy chọn cho các biểu thức hàm trong khi nó là bắt buộc đối với một khai báo hàm (các parens làm cho nó trở thành một biểu thức hàm). Xem http://kangax.github.io/nfe/#expr-vs-decl –
Tôi không sử dụng JSLint. Nếu bạn làm, hãy hiểu nó là một công cụ thiên vị. I * thích * sử dụng liên tục biểu mẫu '; (hàm ..)()' - hàng đầu ';' ngăn chặn một lỗi có thể mơ hồ hơn. Cả hai biểu mẫu đều dẫn đến các cây cú pháp tương đương. – user2246674
@ user2246674 Bạn đã nhập sai chữ H cho chữ L chưa? ': P' –