คำศัพท์สำหรับฟังก์ชั่น JavaScript ที่ไม่ระบุชื่อเรียกว่าอะไรทันที


29

ฉันกำลังเขียนคู่มือสไตล์ JavaScript สำหรับทีมของฉันเพื่อให้เราสามารถจัดระเบียบและมีส่วนร่วมในเอกสารของเราได้ง่ายขึ้น แต่ฉันได้เจอปัญหาเล็ก ๆ น้อย ๆ ซึ่งเป็นที่ที่คำถามของฉันใช้ ...

ฉันควรจะเรียกใช้ฟังก์ชัน JavaScript แบบไม่ระบุชื่อที่เรียกว่าอะไรในทันที ฉันรู้ว่าฉันสามารถเรียกมันว่า "ฟังก์ชั่นที่ไม่ระบุชื่อ" ได้ แต่ฉันอยากจะเน้นความจริงที่ว่ามันถูกเรียกใช้ทันที

นี่คือตัวอย่าง:

var MyVariable = (function(data){
  return "another value"
})("some value"); 

console.log(MyVariable);
// "another value"

1
โปรดทราบว่าคุณมักจะเห็นโครงสร้างนี้ (ไม่ถูกต้อง) เรียกว่า"ฟังก์ชันเรียกตนเอง"
AakashM

คำตอบ:


39

พวกเขามีคำศัพท์อยู่ในโลกของ Javascript แล้ว พวกเขาถูกเรียกว่านิพจน์ฟังก์ชันที่เรียกใช้ทันที (IIFE)(IIFE)

มันคืออะไร

ฟังก์ชั่น IIFE ไม่ได้รับชื่อ แต่จะถูกดำเนินการเพียงครั้งเดียวเมื่อล่ามมาถึงพวกเขา:

var area = function() {
    var width = 3;
    var height = 2;
    return width * height;
}();

วงเล็บสุดท้ายหลังจากที่วงเล็บปีกกาปิดการป้องกันรหัสบอกล่ามที่จะเรียกฟังก์ชั่นการแสดงออกทันที

หากคุณเขียนการประกาศฟังก์ชันคุณต้องเพิ่มตัวดำเนินการจัดกลุ่มหรือวงเล็บล้อมรอบฟังก์ชันเพื่อบอกล่ามให้ใช้ฟังก์ชันเป็นนิพจน์ที่สามารถเรียกใช้ได้ทันที:

var area;
(function() {
    var width = 3;
    var height = 2;
    area = width * height;
}());


เมื่อมีการใช้งาน

IIFE ใช้สำหรับรหัสที่ต้องการเรียกใช้เพียงครั้งเดียวภายในงานแทนที่จะเรียกซ้ำหลายครั้ง

  1. เป็นอาร์กิวเมนต์เมื่อเรียกใช้ฟังก์ชัน (เพื่อคำนวณค่า ฯลฯ )
  2. เพื่อกำหนดค่าของคุณสมบัติให้กับวัตถุ
  3. ในตัวจัดการเหตุการณ์และผู้ฟัง
  4. เพื่อป้องกันความขัดแย้งระหว่างสองสคริปต์ที่อาจใช้ชื่อตัวแปรเดียวกัน พวกเขาสามารถใช้เป็น wrappers เพื่อวางรหัสในสคริปต์อื่นที่คุณไม่แน่ใจว่าชื่อตัวแปรอาจเหมือนกันหรือไม่

หนึ่ง nitpick: ในตัวอย่างของคุณโดยใช้var area = ...คุณไม่จำเป็นต้อง "ตัด" วงเล็บต่อการทำงานเพราะมันเป็นอยู่แล้ว=การแสดงออกที่ฟังก์ชั่นโดยอาศัยอำนาจของการเป็นอยู่ทางด้านขวามือของ วงเล็บการห่อจะต้องใช้เมื่อฟังก์ชันถูกเขียนเป็นการประกาศฟังก์ชัน (เช่นไม่มีการนำหน้าvar area = ...)
Eric King เมื่อ

@EricKing ฉันทำถูกไหม?
ลอเรนซ์ Aiello

มันอาจจะดีที่จะสามารถให้มากขึ้นลวกเรียกเหล่านี้แสดงฟังก์ชั่น '
กรอง

@LawrenceAiello ฉันได้เพิ่มการแก้ไขเพื่อแสดงสิ่งที่ฉันหมายถึง หวังว่ามันจะใช้ได้สำหรับคุณ
Eric King

ในฐานะที่เป็นคำถามที่เกี่ยวข้องมีเหตุผลใดที่จะส่งผ่านการโต้แย้งไปยัง IIFE ตามที่คำถามแสดง? ฉันเคยเห็นสิ่งเหล่านี้เช่นวิธีที่คุณสาธิต - โดยไม่มีข้อโต้แย้งใด ๆ (เนื่องจากข้อโต้แย้งใด ๆ สามารถเป็นตัวแปรท้องถิ่น)
Kat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.