2012-01-08 17 views
62

Tôi biết điều này là ngớ ngẩn, nhưng có bất kỳ sự khác biệt giữa điều này:(...()) vs (...)() trong việc đóng cửa javascript

(function() { 
    var foo = 'bar'; 
})(); 

và điều này?

(function() { 
    var foo = 'bar'; 
}()); 

JSLint cho chúng ta biết để Move the invocation into the parens that contain the function, nhưng tôi thấy không cần phải.

Chỉnh sửa: Câu trả lời quá tuyệt. ~function, thay thế JSHint cùng với tùy chọn của jQuery cho (/***/)(); và giải thích của Crockford! Tôi nghĩ tôi sẽ chỉ nhận được một câu trả lời "chúng giống nhau".
Các bạn quyết định điều tốt nhất thông qua các cuộc bỏ phiếu và tôi đánh dấu vào nó.

+1

Hai ví dụ này rất gần giống nhau nhưng phiên bản 'quả bóng con 'trả về kết quả bên ngoài tập hợp dấu ngoặc đơn đầu tiên trong khi phiên bản được Crockford phê duyệt trả về bên trong. Điều này hiếm khi có ý nghĩa nhưng đó là một sự khác biệt. – Okonomiyaki3000

+0

@ Okonomiyaki3000 Nó không phải là một sự khác biệt, trừ khi bạn có ý nghĩa thay đổi nó (tức là, thêm nhiều thứ bên trong dấu ngoặc đơn). Trong thực tế, tôi giả sử 'foo = (/ *** /)();' và 'foo = (/ *** /());' có thể biên dịch thành cùng một bytecode. Xem xét cách '(a + b) + (c + d)' sẽ biên dịch thành 'a + (b + c) + d'. –

+0

Có, 'foo = (/ *** /)();' và 'foo = (/ *** /());' giống nhau nhưng '(foo =/*** /)();' và '(foo =/*** /)();' thì không. Và, vâng, đây là hình ảnh. Có lẽ không bao giờ có một lý do rất tốt để làm điều này. – Okonomiyaki3000

Trả lời

48

Không có sự khác biệt. Cả hai đều là các cách hợp lệ để có được trình phân tích cú pháp JavaScript để xử lý hàm của bạn dưới dạng biểu thức thay vì khai báo .

Lưu ý rằng +! cũng sẽ làm việc, và đôi khi được sử dụng bởi minifiers để lưu một ký tự của kích thước:

+function() { 
    var foo = 'bar'; 
}(); 

!function() { 
    var foo = 'bar'; 
}(); 

EDIT

Như @copy chỉ ra, cho đầy đủ, ~- cũng sẽ hoạt động.

-function() { 
    var foo = 'bar'; 
}(); 

~function() { 
    var foo = 'bar'; 
}(); 
+0

+1, tôi chưa bao giờ biết điều đó. – Ryan

+14

Vì lợi ích của sự hoàn chỉnh, '~' và '-' cũng sẽ làm điều này (tất cả các toán tử đơn nhất). '~' là cách tuyệt vời nhất. – copy

+3

Wow, +1 cho cú pháp khó hiểu đó! Đó là làm cho một số lập trình viên không nghi ngờ làm xước đầu họ nếu họ thấy nó trong sản xuất. Liệu nó làm việc qua trình duyệt sau đó? Là nó trong spec? Tôi không thể hiểu tại sao nó hoạt động. –

10

Không, tôi không tin có bất kỳ sự khác biệt nào. Cá nhân tôi thích cái cũ hơn (và jQuery và cộng sự dường như đồng ý) nhưng cả hai đều hoạt động giống nhau trong mọi công cụ mà tôi đã thử nghiệm.

Ngoài ra, JSLint đôi khi hơi quá nghiêm ngặt. JSHint có thể tốt hơn một chút về vấn đề đó.

+2

Tôi thích cái cũ hơn nữa. –

+0

Ồ, không biết gì về JSHint. Có, chỉ có mã được viết trong khi thử nghiệm với JSLint vượt qua nó, tôi dường như không bao giờ có khả năng tránh lỗi trước khi kiểm tra. –

38

Đó JSLint vi phạm tồn tại vì Douglas Crockford nói rằng phiên bản ngoài ngoặc trông giống như "quả bóng con chó".

Bạn có thể nghe ông thảo luận về nó trong this video:

I think that looks goofy, 'cause what we're talking about is the whole invocation, but we got these things hanging outside of it looking sorta like ... dog balls.

Ông gợi ý rằng các dấu ngoặc đơn bên giúp người đọc hiểu rằng toàn bộ câu lệnh là một biểu chức năng chứ không phải là một tuyên bố.

+2

+1 - vì vậy đó là những gì Crockford trông giống như :) –

+18

Tôi muốn có một hộp kiểm 'Ignore Douglas Crockford's preferences 'trong JSLint. –

+0

Ông biện minh cho nhiều quy tắc JSLint trong video đó, và một số trong số đó có lý do chính đáng. Nhưng một số người trong số họ cũng khá kén chọn. –