การใช้ Array.prototype.slice.call(arguments) ใน JavaScript
สวัสดีครับท่านผู้อ่าน เราก็กลับมาพบกันอีกครั้งนะครับ วันนี้ผมมาเสนอวิธีการเรียกใช้ฟังก์ชันของภาษา JavaScript เรียบ ๆ ง่าย ๆ ซึ่งผมคิดว่าหลายคนอาจจะรู้อยู่แล้วหละ เพียงแค่อ่านหัวข้อ หรืออาจจะเคยเห็นการใช้งานทำนองนี้แต่เป็นของภาษาอื่นแต่ก็ยังไม่เคยได้ค้นหาว่า เอ๊ะ ของภาษา JavaScript นี้มันมีหรือเปล่า แล้วถ้ามีเค้าใช้กันท่าไหนกัน เราไปลองดูกันเลยครับผม
ก่อนอื่นเลย สมมุตินะครับ ว่าเราต้องการเขียนฟังก์ชันสำหรับบวกเลข แล้วคืนผลลัพธ์การบวกนั้นกลับไป เราสามารถเขียนได้อย่างสั้น ๆ ง่าย ๆ เพียง
เราก็จะสามารถหาผลลัพธ์ของการบวกเลขสองตัวได้ แค่เรียก sum(2,6) ก็ได้ 8 กลับมาใช่ไหมครับ แต่ถ้าอยู่มาวันหนึ่ง เราเกิดอยากได้ผลลัพธ์การบวกของเลขมากกว่าสองตัวล่ะ เช่น เราอยากได้ผลลัพธ์ของการบวกเลข 5,6,42 และ 23 เข้าด้วยกัน เราควรทำอย่างไรดี
หลายคนอาจจะคิดเลยว่า ง่ายมาก ก็แค่เรียกฟังก์ชันเดิมซ้ำ ทั้งหมดสามครั้ง หรือเรียกซ้อนกันไปเลยในบรรทัดเดียวได้ง่ายๆๆ แบบนี้
แต่ก็จะมีคำถามตามมาอีกมากมายว่า อ้าวแล้วถ้าอย่างนี้เราต้องการบวกเลขห้าตัวหล่ะ เจ็ดตัวหละ เราควรจะเขียนซ้อนกันไปเรื่อยๆ หรือว่าสร้างฟังก์ชั่นขึ้นมาใหม่สำหรับบวกเลขห้าตัว เจ็ดตัวโดยเฉพาะเลยดีกว่ากันล่ะ
บางคนปิ๊งไอเดียว่า ถ้าอย่างนั้นเราใช้ method reduce ของ Array ไปเลยสิ แล้วโยนฟังก์ชัน sum ของเราเข้าไป จะมีกี่ตัวก็ได้ ง่ายนิดเดียว
ซึ่งเรามาถูกทางแล้วครับ แต่การทำแบบนี้ เราต้องสร้าง array ของ input ขึ้นมาก่อน อาจจะด้วยการ push ทีละตัว หรืออย่างไรก็ว่ากันไป ซึ่ง array นั้นอาจจะไม่ได้ใช้งานอะไรอย่างอื่นอีกเลยนอกจากเรียก reduce
โชคดีที่ JavaScript มี object ชื่อ arguments ที่จะมาช่วยอำนวยความสะดวกให้กับเรา (ต่อจากตัวอย่างข้างบนอีกนิด) นั่นเอง เอง..เอง..ง.
โดยเจ้า arguments object นั้นจะประพฤติตัวคล้ายกับ Array ของค่าทั้งหมดที่ถูกส่งเข้ามาให้กับฟังก์ชัน แต่ว่าความพิเศษของเจ้า arguments object นั้นก็คือ เราสามารถเรียกมันได้ ถึงแม้ว่าที่ฟังก์ชัน จะไม่ได้มีการประกาศว่าจะรับ parameters ใด ๆ ไว้เลยก็ตาม
ที่ผมบอกว่าประพฤติตัวคล้ายกับ Array คือสามารถเข้าถึงค่าได้ด้วยวงเล็บเหลี่ยม [] ได้ และ มีคุณสมบัติความยาว (length) แต่นอกจากนั้นก็ไม่มีคุณสมบัติอื่น ๆ ของ Array อีกเลย
ดังนั้นการเรียก Array.prototype.slice.call(arguments) ก็คือการเรียก method slice ตามด้วย call เพื่อส่งต่อสมบัติของ this
จาก object หนึ่งไปยังอีก object หนึ่งได้
ฟังก์ชันการบวกของเราหลังจากนำเจ้า arguments object มาช่วยก็จะหน้าตาเป็นอย่างนี้
ข้อดีจากวิธีก่อนหน้า ก็คือ เราสามารถเรียกใช้งานการบวกตัวเลข กี่ตัวก็ได้ โดยที่ไม่ต้องใส่ค่าใน array ก่อนเลยนั่นเอง และเราก็ไม่ต้องใส่ parameter ที่ฟังก์ชันเลยก็ได้
ซึ่งอาจทำให้ดูเรียบร้อยสวยงาม แต่ก็อาจทำให้อ่านยากขึ้นเหมือนกัน ถ้าเกิดฟังก์ชัน sum ใหญ่มาก ๆ แล้วเราก็อาจจะหา arguments object ได้ลำบาก ไม่เหมือนกำหนดไว้ที่หัวฟังก์ชัน
สุดท้ายวันนี้ผมก็ขอตัวลาไปก่อนนะครับ หวังว่าบนความนี้จะมีประโยชน์บ้างไม่มากก็น้อย แล้วพบกันใหม่ครั้งหน้า ขอบคุณครับ