ทุกฟังก์ชัน Javascript ต้องคืนค่าหรือไม่


102

ฉันใช้ Netbeans เพื่อเพิ่มความคิดเห็นแบบมืออาชีพในแต่ละฟังก์ชันฉันเขียน ดังนั้นฉันจึงเริ่มต้นด้วย/**จากนั้นฉันก็กดEnterเพื่อให้ Netbeans ตอบสนองความคิดเห็นเริ่มต้นสำหรับฟังก์ชันต่อไป

จนถึงตอนนี้ฉันใช้สิ่งนี้สำหรับภาษา PHP เท่านั้นและในกรณีนี้ Netbeans มักจะเพิ่ม@returns {type}ส่วนในรูปแบบความคิดเห็นเท่านั้นหากทำตามฟังก์ชัน PHP รวมreturnคำสั่งไว้จริงๆ เรียกว่า "โพรซีเดอร์" (ฟังก์ชันที่ไม่คืนค่าใด ๆ ) ส่วนนี้หายไป

วันนี้ฉันลองทำสิ่งเดียวกันกับฟังก์ชัน Javascript และ Netbeans ได้เพิ่ม@returns {undefined}ส่วนในโครงร่างความคิดเห็นแม้ว่าฟังก์ชันต่อไปนี้จะไม่ส่งคืนอะไรเลย

สิ่งนี้ทำให้ฉันสับสน Netbeans แนะนำแบบนี้หรือไม่ว่าทุกฟังก์ชั่น Javascript ต้องส่งคืนอะไร ฉันควรทำอย่างไรดี? ละเว้น (หรือลบ) ส่วนรูปแบบความคิดเห็นนั้นหรือทำตามคำแนะนำ (หากนี่เป็นคำแนะนำเลย) และเพิ่มreturn false;ในตอนท้ายของฟังก์ชันดังกล่าวแม้ว่าจะไม่มีประโยชน์สำหรับฉัน


6
ถ้าไม่มีค่าตอบแทนมีการระบุ JavaScript undefinedจะกลับมา ในหลายภาษาผลลัพธ์ของคำสั่งสุดท้ายจะถูกส่งกลับ (มีประโยชน์มากกว่า IMO) เหล่านี้เรียกว่าผลตอบแทนโดยปริยาย
Zaz

สิ่งนี้ตอบคำถามของคุณหรือไม่? ฉันต้องส่งคืนบางสิ่งในฟังก์ชัน javascript หรือไม่?
cOborski

คำตอบ:


192

คำตอบสั้น ๆ คือไม่

จริงคำตอบคือใช่: เครื่องยนต์ JS จะต้องมีการแจ้งว่าฟังก์ชั่นบางอย่างได้เสร็จสิ้นการทำธุรกิจของ บริษัท ซึ่งจะกระทำโดยฟังก์ชั่นกลับมาบางสิ่งบางอย่าง และนี่ก็เป็นเหตุผลว่าทำไมแทนที่จะ"สำเร็จรูป"ซึ่งเป็นฟังก์ชั่นบอกว่าจะ"กลับมา"
ฟังก์ชันที่ไม่มีคำสั่งส่งคืนอย่างชัดเจนจะส่งคืนundefinedเช่นฟังก์ชัน C (++) ที่ไม่มีค่าส่งคืนจะถูกกล่าว (และลายเซ็นของมันสะท้อนถึงสิ่งนี้) เพื่อส่งคืนvoid:

void noReturn()//return type void
{
    printf("%d\n", 123);
    return;//return nothing, can be left out, too
}

//in JS:
function noReturn()
{
    console.log('123');//or evil document.write
    return undefined;//<-- write it or not, the result is the same
    return;//<-- same as return undefined
}

นอกจากนี้ใน JS เช่นเดียวกับในทุกภาษาคุณมีอิสระที่จะเพิกเฉยต่อค่าส่งคืนของฟังก์ชันซึ่งทำได้แย่มาก:

(function()
{
    console.log('this function in an IIFE will return undefined, but we don\'t care');
}());
//this expression evaluates to:
(undefined);//but we don't care

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

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


5
ฉันไม่เชื่อว่า C ++ (หรือ C) "คืนค่าเป็นโมฆะ" แท็ก "void" ระบุว่าไม่ส่งคืนอะไรเลย แม้ว่าจะเป็นประเด็นเล็กน้อยและไม่มีส่วนเกี่ยวข้องกับคำถามที่ถาม
เจ

2
มันไม่ได้ส่งคืนจริงvoidมันไม่ส่งคืนอะไรเลย แต่ลายเซ็นของมันสะท้อนผ่านvoidประเภทการส่งคืน
Elias Van Ootegem

มีประโยชน์ด้านประสิทธิภาพสำหรับผลตอบแทนที่ชัดเจนกับโดยปริยายหรือไม่?
4 นาที

@ 4m1r: ไม่รู้อาจขึ้นอยู่กับเครื่องยนต์ หากมีความแตกต่างด้านประสิทธิภาพก็มักจะไม่สำคัญ ผลตอบแทนโดยปริยาย vs return;อาจมีประโยชน์ก็ต่อเมื่อคุณต้องกลับก่อนเวลา การเขียนreturn undefined;อาจให้ผลลัพธ์ที่แตกต่างกันหากundefinedแก้ไขเป็นค่าอื่น เบราว์เซอร์ส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) จะเกิดข้อผิดพลาดเมื่อคุณพยายามกำหนดใหม่ที่ไม่ได้กำหนด แต่ในทางทฤษฎีแล้วนี่เป็นตัวอย่างการใช้ node.js
Elias Van Ootegem

1
@SebastianLasse: ฉันอ้างถึงvoidในภาษาอื่น (เช่น C) ซึ่งคุณสามารถมีฟังก์ชันเช่นvoid do_someting(int *arg)นี้ได้ แต่คุณไม่สามารถมีตัวแปรกับประเภทvoidได้ ใน C voidไม่ใช่ประเภทจริงๆดังนั้นฟังก์ชันเหล่านี้จึงไม่ส่งคืนอะไรเลยพวกเขาแค่กระโดด
Elias Van Ootegem


8

ทุกฟังก์ชัน Javascript ต้องคืนค่าหรือไม่

ไม่พวกเขาไม่ทำ เป็นความจริงที่ว่าลึก ๆ แล้วข้อกำหนดเหล่านี้ล้วนแตกต่างกันเล็กน้อย :

function foo() {
}
function foo() {
    return;
}
function foo() {
    return undefined;
}

... แต่ผลของการเรียกแต่ละคนเหมือนกัน: undefined. ดังนั้นในแง่ปฏิบัติ:

  1. คุณไม่จำเป็นต้องเขียน a returnคุณสามารถปล่อยให้การเรียกใช้โค้ด "หลุดจากจุดสิ้นสุด" ของฟังก์ชัน
  2. หากคุณกลับมาundefinedโดยเฉพาะคุณเป็นเพียงการเขียนreturn;
  3. เมื่อเรียกใช้ฟังก์ชันคุณไม่สามารถบอก (ในรหัส) ได้ว่าการดำเนินการล้มเหลวสิ้นสุดลงด้วยreturn;หรือจบลงด้วยreturn undefined;; ทั้งหมดนี้มีลักษณะเหมือนกันทุกประการกับรหัสโทรศัพท์ของคุณ

Re the spec: โดยเฉพาะเมื่อการดำเนินการของฟังก์ชันหลุดจากจุดสิ้นสุดในข้อมูลจำเพาะนั้นเป็นการเสร็จสิ้น "ปกติ" แต่return;และreturn value;ทั้งสองเป็น "ผลตอบแทน" ที่เสร็จสมบูรณ์โดยมีค่าที่เกี่ยวข้อง ( undefined) ซึ่งแตกต่างกัน (เล็กน้อย) แต่ความแตกต่างถูกกำจัดโดยความหมายของการเรียกใช้ฟังก์ชันซึ่งกล่าวว่า:

...

  1. ถ้าผลลัพธ์ [[Type]] เป็นreturnให้ส่งคืน NormalCompletion ( ผลลัพธ์ [[ค่า]])
  2. ReturnIfAbrupt ( ผลลัพธ์ )
  3. ส่งคืน NormalCompletion ( ไม่ได้กำหนด )

ดังนั้นจึงไม่มีความแตกต่างที่คุณสามารถสังเกตได้ในโค้ด


2

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

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