ฉันกำลังมองหาข้อมูลเกี่ยวกับฟังก์ชั่นที่ถูกเรียกใช้ในทันทีและบางแห่งที่ฉันพบสัญกรณ์นี้:
+function(){console.log("Something.")}()
บางคนสามารถอธิบายให้ฉันฟังได้ว่าการ+
ลงชื่อเข้าใช้ที่หน้าฟังก์ชันมีความหมายว่าอย่างไร
ฉันกำลังมองหาข้อมูลเกี่ยวกับฟังก์ชั่นที่ถูกเรียกใช้ในทันทีและบางแห่งที่ฉันพบสัญกรณ์นี้:
+function(){console.log("Something.")}()
บางคนสามารถอธิบายให้ฉันฟังได้ว่าการ+
ลงชื่อเข้าใช้ที่หน้าฟังก์ชันมีความหมายว่าอย่างไร
คำตอบ:
มันบังคับให้ parser จัดการส่วนที่ตามหลัง+
นิพจน์ โดยปกติจะใช้สำหรับฟังก์ชันที่เรียกใช้ทันทีเช่น:
+function() { console.log("Foo!"); }();
หากไม่มี+
ตัวแยกวิเคราะห์หากอยู่ในสถานะที่ต้องการคำสั่ง (ซึ่งอาจเป็นนิพจน์หรือหลายคำสั่งที่ไม่ใช่นิพจน์) คำนั้นfunction
จะดูเหมือนจุดเริ่มต้นของการประกาศฟังก์ชันแทนที่จะเป็นหน้าที่ของนิพจน์และ()
ต่อไปนี้ (รายการที่ท้ายบรรทัดด้านบน) จะเป็นข้อผิดพลาดทางไวยากรณ์ (เช่นเดียวกับที่ไม่มีชื่อในตัวอย่างนั้น) ด้วย+
ก็จะทำให้มันฟังก์ชั่นการแสดงออกซึ่งหมายความว่าชื่อเป็นตัวเลือกและผลลัพธ์ในการอ้างอิงถึงฟังก์ชั่นที่สามารถเรียกดังนั้นวงเล็บที่ถูกต้อง
+
เป็นเพียงหนึ่งในตัวเลือก นอกจากนี้ยังสามารถ-
, !
, ~
หรือเพียงใดเกี่ยวกับผู้ประกอบการเอกภาคอื่น ๆ อีกวิธีหนึ่งคุณสามารถใช้วงเล็บ (นี่เป็นเรื่องธรรมดามากขึ้น แต่ไม่ถูกต้องมากขึ้นหรือน้อยลงในการสร้างประโยค)
(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
บริษัท ย่อยของคำตอบของ @ TJCrowder +
มักใช้ในการบังคับให้ใช้การคำนวณค่าตัวเลขตามคำตอบ SOนี้ ในกรณีนี้มันถูกเรียกว่า 'ผู้ประกอบการบวก unary' (เพื่อความสะดวกในการ googling)
var num = +variant;
ดังนั้นในด้านหน้าของฟังก์ชันมันสามารถเป็นวิธีบังคับให้ผลลัพธ์ของฟังก์ชันถูกตีความเป็นตัวเลข ฉันสงสัยว่ามันจะเกิดขึ้น แต่ในทางทฤษฎีแล้ว JIT สามารถใช้ฟังก์ชันนี้เพื่อรวบรวมฟังก์ชั่นเป็นตัวเลขเท่านั้นเป็นต้นอย่างไรก็ตามเพื่อป้องกัน unary plus และการต่อกันเมื่อใช้ในนิพจน์ขนาดใหญ่คุณจะต้องใช้วงเล็บ:
blah + (+(function(){ var scope; return "4"; })());
(+function() { ... })()
สัญกรณ์ไม่สามารถดำเนินการได้โดยไม่ต้องมีข้อผิดพลาด (นอกเหนือจากความจริงที่ว่านี้ไม่ตอบคำถาม)
3++function...
สิ่งที่ไม่เหมือนกัน
+function...
ไม่จำเป็นในตัวเอง ผลลัพธ์เดียวกันสามารถมีblah + function( ){ ... }( );
ซึ่งจะลบล้างความต้องการในการตัดวงเล็บ
ดังนั้นคำตอบสั้น ๆ คือป้องกันข้อผิดพลาดทางไวยากรณ์โดยใช้ฟังก์ชั่นผลลัพธ์ไม่ทางใดก็ทางหนึ่ง
นอกจากนี้คุณยังสามารถสั่งให้เครื่องยนต์รู้ว่าคุณไม่สนใจค่าตอบแทนด้วยการใช้void
โอเปอเรเตอร์:
void function() { console.log("Foo!"); }();
แน่นอนว่าการใส่เครื่องมือจัดฟันไปรอบ ๆ สิ่งนั้นก็เพื่อจุดประสงค์นั้น