2012-01-25 36 views
6

Có thể trùng lặp là gì:!
!function(){ }() vs (function(){ })()sự khác biệt giữa function() {}() và function() {}()

Vì vậy, tôi chỉ đọc qua nguồn Bootstrap (2.0) mới từ Twitter và nhận thấy rằng có một dấu chấm than trước khi tự gọi hàm ẩn danh. Khi tôi nhìn thấy điều này tôi ngay lập tức nghĩ "Ôi trời, có một cách mới tốt hơn để làm điều này?".

Tự tìm hiểu!

Anyways, sự khác biệt là gì? Phải có một lý do cho nó bởi vì họ sử dụng nó một cách nhất quán trong tất cả các plugin JavaScript của họ (cho Bootstrap).

Một điều khác mà tôi nhận thấy là "sử dụng nghiêm ngặt" ngay sau đó. Tôi không nghĩ rằng nó liên quan đến yêu cầu trước đây của tôi, nhưng bất cứ ai có thể giải thích điều này?

Cảm ơn!

Trả lời

14
function(){}(); 

Bởi bản thân (xem bình luận Point) sẽ không có giá trị, vì

function() {} 

là một khai báo hàm. Để gọi nó ngay lập tức, bạn cần phải có được công cụ JavaScript để xử lý hàm như là một biểu thức . Mọi người thường làm điều này như một trong hai

(function(){})(); //more common 

(function(){}()); // Papa Crockford's preference: 

với

!function(){}(); 

chỉ đơn giản là một phiên bản tốc ký của điều tương tự.

+2

+1. Bạn đang ở trên lửa! – gdoron

+0

+1 Mặc dù sau đó là không cần thiết nhưng thực hành tốt accoding để Doughlas Crackford :) – Sarfraz

+0

@gdoron - và tôi giới hạn ngay bây giờ. Trở lại làm việc tốt hơn :) –

8

Nếu bạn có 2 kịch bản:

script1.js:

(function(){ 

})() 

script2.js:

(function(){ 

})() 

Và bạn ghép chúng, bạn nhận được:

(function(){ 

})() 
(function(){ 

})() 

Điều này gây ra lỗi, trong khi:

!function(){ 

}() 
!function(){ 

}() 

Không.

+0

+1 Điều đó rất hữu ích. – Sarfraz

+0

Đây cũng là lý do một số kịch bản sử dụng dấu chấm phẩy lúc bắt đầu: '; (function() {}())' – hugomg

+1

Vì vậy, sẽ an toàn khi nói '; (function() {}())' và ' ! function() {}() 'phục vụ cùng một mục đích? – Johnny

3

Các ECMAScript Language Specification, phần 12,4, nói:

Một ExpressionStatement không thể bắt đầu với từ khóa function vì đó có thể làm cho nó rõ ràng với một FunctionDeclaration.

Vì vậy, nếu bạn muốn tuyên bố biểu thức thực hiện một chức năng ẩn danh, bạn phải giải quyết hạn chế này. Việc thêm một số ! (chỉ phủ nhận kết quả của hàm) làm cho nó rõ ràng với trình thông dịch rằng nó không phải là một khai báo hàm, tránh sự mơ hồ này.

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