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?
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?
Câu trả lời:
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ừ function
trô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!"); }());
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"; })());
(+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).
3++function...
không giống nhau.
+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.
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 void
toá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 đó.