ฉันกำลังมองหาข้อมูลเกี่ยวกับฟังก์ชั่นที่ถูกเรียกใช้ในทันทีและบางแห่งที่ฉันพบสัญกรณ์นี้:
+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!"); }();
แน่นอนว่าการใส่เครื่องมือจัดฟันไปรอบ ๆ สิ่งนั้นก็เพื่อจุดประสงค์นั้น