Có một tùy chọn JSLint, một trong The Good Parts trên thực tế, rằng "[đòi hỏi] parens xung quanh lời gọi ngay lập tức", có nghĩa rằng việc xây dựngchức năng ngay cú pháp gọi
(function() {
// ...
})();
thay vào đó sẽ cần phải được viết như sau
(function() {
// ...
}());
Câu hỏi của tôi là điều này - bất cứ ai có thể giải thích tại sao biểu mẫu thứ hai này có thể được coi là tốt hơn không? Nó có khả năng đàn hồi hơn không? Ít dễ bị lỗi hơn? Lợi thế nào nó có trên biểu mẫu đầu tiên?
Kể từ khi đặt câu hỏi này, tôi đã hiểu tầm quan trọng của việc phân biệt rõ ràng giữa giá trị hàm và giá trị của hàm. Hãy xem xét các trường hợp kết quả của sự thỉnh nguyện ngay lập tức là phía bên tay phải của một biểu thức gán:
var someVar = (function() {
// ...
}());
Mặc dù ngoặc ngoài cùng là cú pháp không cần thiết, các dấu mở ngoặc đưa ra một dấu hiệu lên phía trước rằng giá trị được gán là không phải là chính hàm đó mà là kết quả của hàm đang được gọi.
Điều này tương tự như lời khuyên của Crockford về cách viết hoa của hàm dựng - nó có nghĩa là để phục vụ như một dấu hiệu trực quan cho bất kỳ ai nhìn vào mã nguồn.
Cảm ơn cho trỏ này ra. Tôi chưa bao giờ tìm được cách để loại bỏ thông báo cảnh báo của JSLint "Hãy cẩn thận khi thực hiện các chức năng trong vòng lặp." Tôi đã cẩn thận, và đã đặt chức năng trong một đóng cửa nhưng JSLint vẫn phàn nàn. Bây giờ tôi biết rằng nó giả định rằng tôi đã sử dụng mẫu thứ hai. –
Xem thêm [Khác biệt giữa (hàm() {})(); và function() {}();] (http://stackoverflow.com/q/423228/1048572) và có thể trùng lặp [Vị trí của dấu ngoặc đơn để tự động thực thi các hàm JavaScript ẩn danh?] (http://stackoverflow.com/ q/3384504/1048572) – Bergi