ฟังก์ชั่น JavaScript
ฟังก์ชั่นจาวาสคริปต์นั้นมีความสามารถมากกว่าเพียงแค่ล้อมรอบโค้ดจำนวนมากในขณะที่รอการเรียกให้ดำเนินการ ฟังก์ชั่นมีการพัฒนาอยู่ตลอดเวลานำไปสู่คำนิยามใหม่วิธีการดำเนินการและไวยากรณ์ โพสต์นี้จะกล่าวถึงบทบาทปัจจุบันของฟังก์ชั่น JavaScript ที่ได้เล่นไปแล้ว.
การรู้วิธีการที่แตกต่างกันของการแสดงและการกำหนดฟังก์ชั่นจะเปิดโอกาสให้ การใช้ตรรกะในวิธีที่เหมาะสมที่สุด ใน JavaScript นอกจากนี้คุณอาจตอบคำถามสัมภาษณ์ได้ง่ายขึ้น.
ฟังก์ชั่นการแสดงออก
เมื่อคุณเพียงแค่ระบุฟังก์ชั่นด้วย ฟังก์ชัน
คำหลักพารามิเตอร์ทางเลือกและเนื้อหาของรหัสมันเป็น ฟังก์ชัน การประกาศ.
ใส่การประกาศนั้นในนิพจน์ JavaScript (เช่นในการกำหนดหรือการแสดงออกทางคณิตศาสตร์) มันจะกลายเป็น ฟังก์ชัน การแสดงออก.
// ฟังก์ชันประกาศฟังก์ชัน function_name () ; // ฟังก์ชั่นการแสดงออก var function_name = function () ;
การประกาศ JavaScript ทั้งหมดถูกยกขึ้น (ขยับขึ้นในขอบเขต) ระหว่างการประเมิน ดังนั้นการเขียนการเรียกใช้ฟังก์ชันก่อนการประกาศฟังก์ชันจะไม่เป็นไร (เนื่องจากการประกาศจะถูกย้ายขึ้นอยู่ดี).
function_name (); // การเรียกใช้ฟังก์ชัน [WORKS] function function_name () ;
อย่างไรก็ตามการแสดงออกของฟังก์ชั่นไม่ได้ถูกยกขึ้นเนื่องจากฟังก์ชั่นเป็นส่วนหนึ่งของการแสดงออกและไม่ใช่การประกาศแบบสแตนด์อะโลน.
function_name (); // การเรียกใช้ฟังก์ชัน [ไม่ทำงาน] var function_name = function () ;
การเรียกใช้ฟังก์ชั่นการแสดงออกทันที (IIFE)
มันคือการแสดงออกของฟังก์ชั่นรหัสที่ได้รับการดำเนินการทันที (เพียงครั้งเดียวเมื่อมันประเมิน) คุณสามารถสร้างได้โดยเพิ่ม ()
(ไวยากรณ์ที่ใช้สำหรับเรียกใช้ฟังก์ชัน) ทันทีหลังจากนิพจน์ฟังก์ชัน พวกเขาสามารถไม่ระบุชื่อ (ไม่มีชื่อที่จะเรียกมันด้วย).
ด้านล่างนี้เป็นไวยากรณ์ที่พบบ่อยที่สุดสองแบบในการสร้าง IIFE:
(function optional_function_name () // body ());
และ
(ฟังก์ชัน optional_function_name () // body) ();
วงเล็บที่อยู่รอบ ๆ การประกาศฟังก์ชันจะแปลงเป็นนิพจน์แล้วเพิ่ม ()
หลังจากเรียกใช้ฟังก์ชัน คุณสามารถใช้วิธีอื่นในการสร้าง IIFE ได้ตราบใดที่คุณเพิ่ม ()
หลังจากการแสดงออกของฟังก์ชั่น (เช่นด้านล่าง) แต่วิธีการที่ต้องการคือทั้งสองข้างต้น.
// บางวิธีในการสร้าง IIFEs! function () / * … * / (); + function () / * … * / (); ฟังก์ชั่นใหม่ () / * … * /;
IIFE เหมาะอย่างยิ่งสำหรับการเขียนโค้ดที่ต้องการดำเนินการเพียงครั้งเดียวการกำหนดชื่อการสร้างการปิดการสร้างตัวแปรส่วนตัวและอื่น ๆ อีกมากมาย ด้านล่างเป็นตัวอย่างของการใช้ IIFE.
var page_language = (ฟังก์ชั่น () var lang; // รหัสเพื่อรับภาษาของหน้า return lang;) ();
รหัสเพื่อให้ภาษาของเพจเรียกใช้งานเพียงครั้งเดียว (โดยเฉพาะหลังจากโหลดหน้าเว็บ) ผลลัพธ์จะถูกเก็บไว้ใน page_language
เพื่อใช้ในภายหลัง.
วิธีการ
เมื่อฟังก์ชั่นเป็นคุณสมบัติของวัตถุก็จะเรียกว่าวิธีการ เนื่องจากฟังก์ชั่นเป็นวัตถุฟังก์ชันในฟังก์ชันอื่นจึงเป็นวิธี ด้านล่างเป็นตัวอย่างสำหรับวิธีการภายในวัตถุ.
var calc = add: function (a, b) return a + b, sub: ฟังก์ชั่น (a, b) return a-b console.log (calc.add (1,2)); // 3 console.log (calc.sub (80,2)); // 78
เพิ่ม
และ ย่อย
ฟังก์ชั่นเป็นวิธีการของ Calc
วัตถุ.
ตอนนี้สำหรับฟังก์ชันภายในตัวอย่างฟังก์ชัน:
ฟังก์ชั่นเพิ่ม (a) function return (b) return a + b; console.log (เพิ่ม (1) (2)) // ผลลัพธ์คือ 3
ฟังก์ชันที่ไม่ระบุชื่อที่ส่งคืนเป็นวิธีการของฟังก์ชัน เพิ่ม
.
หมายเหตุ: เนื่องจากพารามิเตอร์ () ของฟังก์ชั่น
เพิ่ม
ในตัวอย่างข้างต้นมีให้ใช้งานสำหรับฟังก์ชั่นต่อไปนี้เรียกกระบวนการชนิดนี้เรียกว่า currying.
ก่อสร้าง
เมื่อคุณเพิ่ม ใหม่
คีย์เวิร์ดก่อนฟังก์ชันและเรียกมันมันจะเป็นตัวสร้างที่สร้างอินสแตนซ์ ด้านล่างนี้เป็นตัวอย่างที่ใช้คอนสตรัคเตอร์เพื่อสร้างอินสแตนซ์ของ ผลไม้
และค่าจะถูกเพิ่มเข้าไปในแต่ละ ผลไม้
คุณสมบัติของ.
ฟังก์ชั่นผลไม้ () ชื่อ var, ครอบครัว; // ชื่อวิทยาศาสตร์ & family this.getName = function () return name;; this.setName = ฟังก์ชัน (ค่า) name = value; this.getFamily = function () return family;; this.setFamily = ฟังก์ชัน (ค่า) family = value; var apple = new Fruit (); apple.setName ("Malus domestica"); apple.setFamily ( "Rosaceae"); var orange = new Fruit (); orange.setName ("ส้มà ??  ?? â ?? ?? sinensis "); orange.setFamily (" Rutaceae "); console.log (orange.getName ()); //" Citrus à ??  ?? â ?? ?? sinensis "console.log (apple.getName ()); //" Malus domestica "console.log (orange.getFamily ()); //" Rutaceae "
ฟังก์ชั่นลูกศร (มาตรฐาน ES6) [เฉพาะใน Firefox]
นิยามฟังก์ชั่นใหม่จากมาตรฐาน ES6 ให้ไวยากรณ์ที่สั้นลงสำหรับการแสดงออกฟังก์ชั่น ไวยากรณ์คือ
() => / * body * /
ฟังก์ชั่นตัวอย่างนี้:
var sing = function () console.log ('ร้องเพลง…');
เหมือนกับ:
var sing = () => console.log ('ร้องเพลง ... ');
ฟังก์ชั่นลูกศรไม่ระบุชื่อและไม่มีของตัวเอง นี้
ราคา, นี้
ภายในมันจะเป็นเช่นเดียวกับ นี้
ในรหัสที่แนบมา นอกจากนี้คุณไม่สามารถเปลี่ยนเป็นตัวสร้างด้วย ใหม่
คำหลัก.
มันมีประโยชน์สำหรับเมื่อคุณต้องการ นี้
ภายในฟังก์ชั่นจะเหมือนกับนอกและไวยากรณ์ที่สั้นกว่าของมันทำให้รหัสสำหรับการเขียนฟังก์ชั่นภายในฟังก์ชั่นรัดกุม (เช่นด้านล่าง)
setInterval (ฟังก์ชั่น () console.log ('ข้อความ'), 1,000);
เข้าไป
setInterval (() => console.log ('ข้อความ'), 1,000);
ฟังก์ชันตัวสร้าง (มาตรฐาน ES6) [เฉพาะใน Firefox]
นิยามฟังก์ชั่นใหม่อีกอย่างจากมาตรฐาน ES6 คือฟังก์ชั่นสร้าง ฟังก์ชันตัวสร้างมีความสามารถในการหยุดและดำเนินการต่อ ไวยากรณ์ของมันคือ:
function * function_name ()
หรือ
function * function_name ()
ฟังก์ชันตัวสร้างสร้างตัววนซ้ำ ตัววนซ้ำ ต่อไป
วิธีการนั้นจะใช้ในการรันรหัสภายในฟังก์ชั่นเครื่องกำเนิดไฟฟ้าจนกระทั่ง ผล
ถึงคำค้นหา หลังจากนั้นค่าซ้ำที่ระบุโดย ผล
คีย์เวิร์ดถูกส่งคืนโดยฟังก์ชันตัวสร้างและการดำเนินการถูกหยุด.
ฟังก์ชันตัวสร้างจะทำงานอีกครั้งเมื่อ ต่อไป
วิธีการที่ถูกเรียกจนต่อไป ผล
ถึงคำค้นหา เมื่อทั้งหมดของ ผล
นิพจน์จะถูกดำเนินการส่งคืนค่าผลตอบแทน ไม่ได้กำหนด
.
ด้านล่างเป็นตัวอย่างง่ายๆ:
ฟังก์ชัน * generator_func (นับ) สำหรับ (var i = 0; iนี่เป็นอีกตัวอย่าง:
ฟังก์ชัน * randomIncrement (i) อัตราผลตอบแทน i + 3; ให้ผลฉัน + 5; ให้ผลฉัน + 10; ให้ผลฉัน + 6; var itr = randomIncrement (4); console.log (. itr.next () มูลค่า); // 7 console.log (itr.next (). value); // 9 console.log (itr.next (). value); // 14นอกจากนี้ยังมี
อัตราผลตอบแทน *
expression ซึ่งส่งผ่านค่าไปยังฟังก์ชันตัวสร้างอื่นฟังก์ชั่น * ผลไม้ (ผลไม้) ผลผลิต * ผัก (ผลไม้); ให้ผลผลิต "องุ่น"; function * veggies (fruit) ให้ผลไม้ + "และผักโขม"; ให้ผลไม้ + "และบรอกโคลี"; ให้ผลไม้ + "และแตงกวา"; var itr = fruits ("Apple"); console.log (. itr.next () มูลค่า); // "Apple และ Spinach" console.log (itr.next (). ค่า); // "Apple และ Broccoli" console.log (itr.next (). ค่า); // "Apple และ Cucumber" console.log (itr.next (). ค่า); // "องุ่น" console.log (itr.next (). value); //ไม่ได้กำหนดฟังก์ชันตัวสร้างมีประโยชน์ถ้าคุณต้องการผ่านค่าหนึ่งต่อหนึ่ง ณ จุดที่คุณต้องการในโค้ดโดยหยุดมันชั่วคราวแทนที่จะไปในทิศทางเดียวเหมือนวนลูปผ่านอาร์เรย์.
ข้อสรุป
ฉันได้รวมรายการอ้างอิงด้านล่างซึ่งคุณจะพบลิงค์ไปยังข้อมูลอ้างอิงและบทความที่มีเนื้อหาเชิงลึกในหัวข้อต่างๆ. ทั้งฟังก์ชั่นมาตรฐาน ES6 จะทำงานเฉพาะใน Firefox ในขณะนี้.
อ้างอิง
- ภาษา ECMAScript: ฟังก์ชั่นและชั้นเรียน
- นิพจน์ฟังก์ชันที่เรียกใช้ทันที (IIFE)
- พื้นฐานของ ES6 Generators
- ฟังก์ชั่นลูกศร
- ฟังก์ชัน - Mozilla Developer Network