เหตุใดจึงใช้ `const foo = () => {}` แทนที่จะเป็น `function foo () {} '


12

ตัวอย่างเช่นในวิดีโอ Reduxนี้ผู้สอนมักใช้ไวยากรณ์เช่น

const counter = (state=0, action) => {
   ... function body here
}

ฉันจะใช้ "ดั้งเดิม" แค่ไหน

function counter(state=0, action) {
   ... function body here
}

ซึ่งสั้นกว่าจริงๆและ IMO จะชัดเจนขึ้น มันง่ายกว่าที่จะสแกนขอบซ้ายที่เป็นธรรมและมีโครงสร้างของหน้าสำหรับคำว่า "ฟังก์ชั่น" มากกว่าการสแกนขอบด้านขวาที่เป็นเศษเล็กเศษน้อยสำหรับขนาดเล็ก "=>"

นอกเหนือจากthisและพยายามที่จะมีวัตถุประสงค์ไม่ใช่ความเห็นมีความแตกต่างหรือประโยชน์ที่เป็นประโยชน์ต่อไวยากรณ์ newfangled หรือไม่


3
คำถามเกี่ยวกับ StackOverflow นี้อาจทำให้คุณสนใจ: stackoverflow.com/questions/34361379/…
Vincent Savard

3
ฉันไม่ใช่ผู้เชี่ยวชาญ JavaScript แต่ฉันเดาconstว่าจะช่วยให้มั่นใจได้ว่าฟังก์ชันจะไม่ได้รับการกำหนดใหม่ในภายหลัง
MetaFight

ขอบคุณ @VincentSavard มันสมบูรณ์แบบและสิ่งที่ฉันคาดไว้: นอกเหนือจาก "สิ่งนี้" และสิ่งต้นแบบ / คลาสดูเหมือนจะไม่แตกต่างกันจริง
949300

3
@ user949300 มีคือความแตกต่างหนึ่ง MetaFight กล่าว นอกจากนี้รูปแบบ / "สิ่งนี้" ก็กลายเป็นความแตกต่างที่สำคัญอย่างรวดเร็วเช่นกัน
msanford

1
เรื่องสั้นโดยย่อ: คุณควรให้ความสำคัญและชัดเจนกับผลประโยชน์ของคดี
Wayne Bloss

คำตอบ:


11

คำสั่งฟังก์ชั่น (ฟังก์ชั่นที่มีชื่อ, ไวยากรณ์ที่ 2 ที่แสดง) ถูกยกขึ้นไปด้านบนของขอบเขตคำศัพท์เต็มแม้กระทั่งคำสั่งที่อยู่เบื้องหลังและบล็อกควบคุมเช่นifคำสั่ง การใช้const(เช่นlet) เพื่อประกาศตัวแปรให้ขอบเขตการบล็อกหยุดการยกแบบเต็ม (การยกเป็นบล็อกเท่านั้น) และทำให้แน่ใจว่าไม่สามารถประกาศใหม่ได้

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


ขอบคุณ คำตอบที่ดี. ฉันได้ทำงานเป็นส่วนใหญ่ในโครงการ JS ขนาดเล็กหรือโครงการเซิร์ฟเวอร์ node.js ที่พวกเขามีระบบโมดูลที่ดีสำหรับการกำหนดชื่อ แต่เพียงแค่เริ่มต้นโครงการด้านลูกค้ามากขึ้นโดยใช้ตัวรวมและนี่เป็นข้อมูลเชิงลึกที่ดี
user949300

2
เพียงแค่ทราบว่าeslint no-func-assignอาจพบปัญหาการประกาศซ้ำนี้
949300

2
รหัสเขียนที่ได้ทำให้เกิดความสับสนสัญญาณเพื่อให้ได้รับประโยชน์ของภาษาพิมพ์แบบคงที่คือเหตุผลที่จะใช้ typescript constไม่ มันค่อนข้างสั้น, IMO, เพื่อเริ่มใช้constทุกที่ด้วยเหตุนี้ในยุค eslint, webpack, babel และอื่น ๆ ไม่มีใครต่อไฟล์เข้าด้วยกันด้วยตนเองอีกต่อไปเป็นเวลาอย่างน้อยหนึ่งทศวรรษแล้ว
Wayne Bloss

2

นี่คือเหตุผลที่คุณควรใช้function:

  1. สัญญาณมีความชัดเจนและรัดกุม นี่เป็นประโยชน์มากกว่าข้อกังวลเกี่ยวกับการยกของเคสที่ระบุไว้ในคำตอบอื่น ๆ

  2. คุณต้องการยกขึ้นภายในโมดูลเพราะอย่างที่คุณเห็นจากโค้ดด้านล่างการconstประกาศความtryDoTheThingล้มเหลวอย่างเงียบ ๆ และจะไม่ถูกจับจนกว่าคุณจะพยายามเรียกมัน

  3. จูเนียร์ส่วนใหญ่ที่ฉันเข้ามาติดต่อด้วยเริ่มใช้constเพื่อประกาศทุกฟังก์ชั่นเพราะมันเป็นแฟชั่นตอนนี้เช่นการใช้ช่องว่างเหนือแท็บหรือทำทุกอย่างfunctional!!!เพราะ "OOP ไม่ดี" อย่าทำอย่างนั้น คุณไม่ต้องการเป็นคนที่ติดตามแฟชั่นโดยไม่เข้าใจความหมายที่แท้จริง

ผ่านhttps://gist.github.com/stephenjfox/fec4c72c7f6ae254f31407295dc72074


/*
This shows that, because of block-scoping, const function references must be
invoked in-order or else things will fail silently.
const's are added the name space serially (in the order in which they appear)
and much of the body isn't declared when we first try to invoke or functions
*/


const tryDoTheThing = () => {
  console.log(`This is me trying to be awesome ${getAwesome()}`)
}


// "getAwesome is not defined", because it is referenced too early
tryDoTheThing() // comment to see the rest work


const getAwesome = () => (+((Math.random() * 10000).toString().split('.')[0]))


const doTheThing = () => {
  console.log(`This is awesome! ${getAwesome()}`)
}

doTheThing() // prints

VS

/*
Function declarations are given two passes, where the first lifts them to
the top of the namespace, allowing "out of order" usage
*/

doTheThing();


function doTheThing() {
  console.log(`This is awesome number ${getAwesome()}`)
}

function getAwesome() {
  return (+((Math.random() * 10000).toString().split('.')[0]))
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.