ทำไม ES6 ถึงไม่มีลูกศรแบบบางฟังก์ชั่น?


16

ES6 เพิ่มฟังก์ชั่นลูกศรไขมัน ( =>) ซึ่งมีสองความแตกต่างที่สำคัญจากฟังก์ชั่นปกติ:

  • ไวยากรณ์ที่สั้นกว่า (รวมถึงการส่งคืนโดยนัยถ้าคุณใช้เนื้อความที่เป็นนิพจน์เดียว)
  • สืบทอดthisมาจากขอบเขตโดยรอบ

สิ่งเหล่านี้เป็นคุณสมบัติที่มีประโยชน์มาก แต่ดูเหมือนว่าฉันจะแยกจากคุณค่าและแอพพลิเคชั่นของพวกเขาโดยสิ้นเชิง - บางครั้งฉันต้องการอย่างใดอย่างหนึ่งหรืออย่างอื่นหรือทั้งสองอย่างหรือทั้งสองอย่าง ดูเหมือนว่าแปลกที่ถ้าฉันต้องการใช้ฟังก์ชั่นไวยากรณ์สั้นฉันต้องใช้this-modifying พฤติกรรม และในทางกลับกัน. ฉันไม่เห็นว่าทำไมความสามารถทั้งสองนี้จึงถูกนำมาใช้เป็นส่วนเสริมของภาษา

ถ้าฉันต้องการใช้ฟังก์ชั่นซินแทกซ์สั้น ๆ สำหรับผลตอบแทนและความกะทัดรัดโดยปริยาย (ในบางบริบทที่เต็มfunction (..) { return ...}จะอ่านได้น้อยกว่าเล็กน้อย) แต่ฉันต้องการใช้thisในฟังก์ชั่นของฉันเพื่ออ้างถึงบริบทการโทร? ไม่มีวิธีทำเช่นนี้

CoffeeScript มีทั้งฟังก์ชั่น->และ=>สไตล์และดูเหมือนว่า ES6 ยืม=>สไตล์จากที่นั่น ดังนั้นคำถามของฉันคือทำไม ES6 จึงไม่ยืม->สไตล์นี้ด้วย?


ฟังก์ชั่นลูกศรไขมันมีความแตกต่างอื่น ๆ เช่นพวกเขาไม่สามารถผูกargumentsทั้ง
DeadMG

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

คำตอบ:


25

ดูข้อเสนอเพื่อเพิ่มฟังก์ชั่นลูกศร: http://wiki.ecmascript.org/doku.php?id=harmony:arrow_function_syntax 1

สิ่งที่กล่าวคือ:

อย่างไรก็ตามเราไม่ต้องการ CoffeeScript -> มันมีความสับสนในการมีลูกศรสองลูกและการเชื่อมโยงแบบไดนามิกนี้เป็นปืนลูกซองที่มีพลัง

นอกจากนี้คุณยังสามารถดูการสนทนาของข้อเสนอเวอร์ชันก่อนหน้าซึ่งมีไวยากรณ์ -> ด้วย: https://esdiscuss.org/topic/arrow-function-syntax-simplified

ดูเหมือนว่าจะลงมาดังต่อไปนี้:

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

1
+1 โปรดทราบว่า ES6 เป็นความพยายามครั้งที่สองในการแนะนำคุณสมบัติเหล่านี้ซึ่งเดิมมีการวางแผนสำหรับการรวมไว้ใน ES4 แต่ข้อมูลจำเพาะถูกทิ้งเมื่อเห็นได้ชัดเจนว่าผู้มีส่วนได้ส่วนเสียสำคัญคิดว่ามันซับซ้อนเกินไปและมีแนวโน้มที่จะทำลายความเข้ากันได้ การทำให้ทุกอย่างเรียบง่ายที่สุดเท่าที่จะเป็นไปได้ต้องเป็นเป้าหมายสำคัญของคณะกรรมการในครั้งนี้
จูลส์

1
ขอบคุณสำหรับคำตอบของคุณ แต่ฉันไม่คิดว่ามันจะครอบคลุม น้อยลงไม่ได้แปลว่าเรียบง่ายขึ้น ฉันจะเถียงว่ามันซับซ้อนกว่าที่จะต้องสลับระหว่างซินแท็กซ์ของฟังก์ชันที่แตกต่างกันสองตัวเพื่อให้ตรรกะที่มีผลผูกพันนี้แตกต่างกัน (เทียบกับการสลับอักขระเดียว) การมี "ฟังก์ชั่นหลายประเภทที่มีความหมายแตกต่างกัน" ไม่ใช่ความคิดที่น่ากลัว มันเป็นสิ่งที่เรามีในความเป็นจริง และฉันไม่เห็นความเข้ากันได้ย้อนหลังเกี่ยวกับสิ่งที่เรากำลังพูดถึง ฉันไม่แนะนำให้พวกเขาควรลบการสนับสนุนสำหรับไวยากรณ์ฟังก์ชั่นแบบคลาสสิกถ้านั่นคือสิ่งที่คุณหมายถึง
callum

2
@callum, ฉันทามติ (อย่างน้อยในหมู่คนที่ตัดสินใจนี้) เป็นfunction()รูปแบบที่มีผลผูกพันนี้เป็นความผิดพลาดและเป็นหูดในภาษา หากทำได้พวกเขาต้องการเปลี่ยนfunction()เป็น=>ซีแมนทิกส์ แต่ไม่สามารถทำได้เพราะจะทำให้ความเข้ากันได้ย้อนหลัง
Winston Ewert

2
@ WinstonEwert แขวนคุณจะบอกว่าคนที่ตัดสินใจจะชอบถ้าพวกเขาสามารถเปลี่ยนfunction()เป็นสืบทอดthisจากขอบเขตโดยรอบเช่น=>อย่างไร ในกรณีนั้นจะไม่thisอ้างอิงถึงวัตถุระดับโลกทุกที่ใช่ไหม ฟังดูแปลก ๆ คุณได้ยินเรื่องนี้ที่ไหน
callum

3
นี่อาจเป็นคำตอบที่ยอมรับได้ แต่ดูเหมือนว่าการออกแบบภาษาจะไม่ดี หากคุณมีภาษาที่ต้องใช้ลูกศรอ้วนก็ควรใช้ลูกศรขนาดเล็กเช่นกัน อดีตบังคับให้ทุกคนเริ่มคิดในแง่ของวัตถุในขณะที่หลังยอมรับประวัติศาสตร์ javascripts ของการออกแบบการทำงานครั้งแรกและบริบทรอการตัดบัญชี
หลัก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.