JavaScript cộng với dấu hiệu phía trước biểu thức hàm


867

Tôi đã tìm kiếm thông tin về các hàm được gọi ngay lập tức và ở đâu đó tôi đã vấp phải ký hiệu này:

+function(){console.log("Something.")}()

Ai đó có thể giải thích cho tôi những gì các +dấu hiệu ở phía trước của chức năng có nghĩa là / không?


17
Ben Alman giải thích tất cả ở đây: mths.be/iife
Mathias Bynens

Câu trả lời:


1321

Nó buộc trình phân tích cú pháp xử lý phần sau +biểu thức. Điều này thường được sử dụng cho các chức năng được gọi ngay lập tức, ví dụ:

+function() { console.log("Foo!"); }();

Nếu không có +ở đó, nếu phân tích cú pháp là trong trạng thái mà nó mong đợi một tuyên bố (mà có thể là một biểu hiện hoặc một số báo cáo không thể hiện), từ functiontrông giống như đầu của một hàm tuyên bố chứ không phải là một chức năng biểu hiện và do đó ()sau nó (những cái ở cuối dòng trên) sẽ là một lỗi cú pháp (như sự vắng mặt của một tên, trong ví dụ đó). Với sự +, nó làm cho nó một biểu hiện chức năng, có nghĩa là tên là tùy chọn và có kết quả trong một tham chiếu đến chức năng, có thể được viện dẫn, vì vậy các dấu ngoặc đơn là hợp lệ.

+chỉ là một trong những lựa chọn. Nó cũng có thể -, !, ~, hoặc chỉ là về bất kỳ nhà điều hành unary khác. Thay phiên, bạn có thể sử dụng dấu ngoặc đơn (điều này phổ biến hơn, nhưng không hơn cũng không kém về mặt cú pháp):

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());

12
Nhiều chi tiết hơn ở đây, benalman.com/news/2010/11/ khăn
Kundan Singh Chouhan

159
Chúng ta không thể nói rằng gói paren là một ký hiệu cao cấp? Tôi rất quen thuộc với các parens phục vụ để bao gồm các biểu thức. Không rõ ràng về những gì + đang làm trong trường hợp này nếu bạn chưa biết cách giải quyết phức tạp này của js.
Chris

1
Lưu ý: Trong hai tùy chọn parens, jsLint thích cái thứ hai hơn. Tôi nghĩ rằng jsHint là ít cầu kỳ.
Củ cải đường-Củ cải đường

43
Một trong những thư viện thường được sử dụng sử dụng ký hiệu "cộng" là Bootstrap (đó là cách tôi kết thúc việc đọc chủ đề này).
Ville

Bootstrap đang làm điều này, btw: maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js
xanderiel

95

Công ty con cho câu trả lời của @ TJCrowder, +thường được sử dụng để ép buộc số lượng giá trị như câu trả lời SO này giải thích . Trong trường hợp này, nó được gọi là 'toán tử cộng đơn nguyên' (để dễ googling).

var num = +variant;

Vì vậy, trước một hàm, nó có thể là một cách để buộc kết quả của hàm được hiểu là một số. Tôi nghi ngờ điều đó chưa xảy ra, nhưng về mặt lý thuyết, JIT có thể sử dụng hàm đó để biên dịch hàm dưới dạng hàm chỉ số, v.v. Tuy nhiên, để ngăn chặn unary cộng là một phép nối khi được sử dụng trong biểu thức lớn hơn, bạn sẽ cần dấu ngoặc đơn:

blah + (+(function(){ var scope; return "4"; })());

3
Làm thế nào điều này bao giờ nhận được 37 upvote? Các (+function() { ... })()ký hiệu không bao giờ có thể thực hiện mà không có lỗi (ngoài thực tế rằng điều này không trả lời câu hỏi).
Whitequark

6
@whitequark: Bỏ lỡ một cặp dấu ngoặc xung quanh hàm + gọi. Nghi ngờ các upvote là nhiều hơn vì giải thích đúc số.
Phil H

10
OK tôi có thể đã được nitpicking.
Whitequark

2
@Christoph Tôi có khuynh hướng để những dấu ngoặc đó ở đó. Trong thực tế, tôi sẽ đi xa hơn để thêm chúng nếu chúng bị mất. Nó làm cho nó rõ ràng hơn nhiều những gì đang xảy ra, và cũng ngăn chặn các vấn đề khi mã được giảm thiểu bằng cách loại bỏ các khoảng trắng, dẫn đến 3++function...không giống nhau.
Stewam 20/11/13

3
Mặc dù về sự phản ánh hơn nữa, +function...bản thân nó là không cần thiết. Kết quả tương tự có thể có với blah + function( ){ ... }( );điều đó sẽ phủ nhận sự cần thiết của dấu ngoặc.
Stewam 20/11/13

61

Vì vậy, câu trả lời ngắn gọn là nó ngăn ngừa lỗi cú pháp, bằng cách sử dụng hàm kết quả theo cách này hay cách khác.

Bạn cũng có thể hướng dẫn công cụ mà bạn thậm chí không quan tâm đến giá trị trả về bằng cách sử dụng voidtoán tử:

void function() { console.log("Foo!"); }();

Tất nhiên, đặt niềng răng xung quanh toàn bộ cũng phục vụ mục đích đó.


45
Vô hiệu hoặc dấu ngoặc đơn là vô cùng thích hợp. Chúng không có WTF. Sử dụng + là loại thông minh không thông minh lắm.
Peter Wone

2
Một điểm tốt. Có vẻ như việc sử dụng một trong các nhà khai thác sẽ đi ngược lại với tiêu chuẩn hiện tại của ngành. Có lẽ các nhà phát triển "cool kid" sẽ chọn nó, nếu không tôi vẫn không thấy mục đích sử dụng thứ gì đó thay vì void hoặc ()
dudewad
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.