Điểm này là bất kỳ biến nào được khai báo trong nội dung thú vị sẽ không được tạo trong không gian tên chung. Bất kỳ hàm nào trong javascript sẽ tạo ra một phạm vi như vậy. Giả sử bạn có một số javascript bạn muốn chạy. Nếu bạn làm điều này:
var b = 1;
// stuff using b
Và một số mã khác sử dụng b, nó sẽ nhận giá trị còn lại của bạn. (Hoặc, thậm chí tệ hơn, nếu một số mã khác đặt b trước khi mã của bạn chạy, sau đó cố gắng để có được giá trị cũ của nó sau đó, bạn đã thay đổi nó trong thời gian chờ đợi.)
Mặt khác, nếu bạn có điều này mã, khai báo và sau đó gọi hàm:
function a() {
var b = 1;
}
a();
Và một số mã sau này sử dụng b, nó sẽ không thấy giá trị của bạn, vì b là cục bộ cho hàm. Vấn đề với điều này, tất nhiên, là bạn vẫn đang tạo một cái tên toàn cầu - "a", trong trường hợp này. Vì vậy, chúng tôi muốn có một chức năng không có tên - đây là lý do tại sao bạn nhận được mã mà bạn mô tả. Nó khai báo một hàm không có tên, và sau đó gọi nó.
Thật không may, bạn không thể chỉ nói:
function() { ... }()
vì điều này sẽ được phân tích như một khai báo hàm tuyên bố, và sau đó một lỗi cú pháp. Bằng cách gói khai báo hàm trong dấu ngoặc đơn, bạn nhận được hàm biểu hiện, sau đó có thể được gọi. Bạn gọi nó giống như bất kỳ biểu thức chức năng nào khác (như a, ở trên), sử dụng bộ parens thứ hai. Ví dụ: nếu hàm đã lấy đối số, bạn sẽ chuyển chúng ở đó:
(function(a) { ... })(1)
Nguồn
2009-03-10 16:56:30
Trừ, tất nhiên, mà bạn xung đột với tên của chức năng của bạn. –
Uh, vâng. Đó là lý do tại sao nó thường được thực hiện với một chức năng nặc danh. Tôi chỉ sử dụng một chức năng được đặt tên để hiển thị một hình thức quen thuộc hơn mà làm điều tương tự. –
jder có câu trả lời tốt hơn, cho những người đến trễ cho bữa tiệc. – Triptych