ผลตอบแทนและผลตอบแทน () ต่างกันอย่างไร?


97
function a() { return 1; }
function b() { return(1); }

ผมทดสอบโค้ดข้างต้นในคอนโซลของ Chrome 1และทั้งสองกลับ

function c() { return "1"; }
function d() { return("1"); }

"1"ฉันยังผ่านการทดสอบโค้ดข้างต้นและทั้งสองฟังก์ชั่นที่ส่งกลับ

ดังนั้นสิ่งที่เป็นความแตกต่างระหว่างการใช้returnและreturn()?


21
คำตอบที่นี่นอกจากนี้ยังจะนำไปใช้void(x),typeof(x)
พอลเอส

3
@ PaulS. -งงเสมอโดยvoid(0)ตั้งแต่มันควรจะเป็นชวเลขไม่ได้กำหนด ถ้าเป็นชวเลขทำไมต้องใส่อักขระที่ไม่จำเป็นด้วย? ;-)
RobG

1
@RobG ฉันคิดว่ามันเป็นการนำมาจากPythonและอาจเป็นประโยชน์สำหรับกรณีพิเศษที่คุณต้องการรวมตัวดำเนินการvoid i = 1; // ReferenceErrorเทียบกับvoid (i = 1); // undefined
Paul S.

1
คำถามนี้คุณอาจจะรู้สึกขบขันซึ่งเป็นคำถามของคุณที่ใช้กับ C #: stackoverflow.com/questions/2186595/…
Eric Lippert

3
เป็นไปได้ที่จะซ้ำกันของWhy use วงเล็บเมื่อกลับมาใน Javascript
Qantas 94 Heavy

คำตอบ:


177

เช่นเดียวกับระหว่าง

var i = 1 + 1;

และ

var i = (1 + 1);

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

returnไม่ได้เป็นฟังก์ชั่น แต่คำสั่ง มันมีลักษณะทางวากยสัมพันธ์กับคำสั่งโฟลว์การควบคุมอย่างง่ายอื่น ๆ เช่นbreakและcontinueไม่ใช้วงเล็บด้วย


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

37
@ chris97ong: return ไม่ใช่หน้าที่
RemcoGerlich

34
หากคุณสร้างreturnเป็นฟังก์ชันคุณจะคืนค่าจากฟังก์ชันได้อย่างไร
dan04

4
นี่เป็นคำตอบที่ดีพร้อมตัวอย่างที่ยอดเยี่ยม แต่ฉันคิดว่ามันอาจจะคุ้มค่าที่จะเพิ่มว่า 'return' ไม่ใช่หน้าที่ในคำตอบหลัก - โดยพิจารณาว่าเป็นต้นตอของความเข้าใจผิดที่นำไปสู่คำถามนี้
BiscuitBaker

3
@BiscuitBaker: ฉันเพิ่มบิต เมื่อฉันจดคำตอบสั้น ๆ นี้ฉันไม่ได้คาดหวังว่ามันจะได้รับ 50+ upvotes ...
RemcoGerlich

21

ไม่มีความแตกต่างกัน

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

return (x == 0);

ในกรณีนี้คุณกลับค่าของคำสั่งx == 0ที่จะกลับมาแบบบูลtrueหรือขึ้นอยู่กับมูลค่าของfalsex


6
การกลับมาเป็นคำสำคัญที่หมายจุดเริ่มต้นของการสั่งกลับ
RobG

1
การประเมินคำสั่งส่งคืนไม่จำเป็นต้องมี "การจัดกลุ่ม" ดังนั้นไม่ว่าในกรณีใดจะมีการคืนค่าบูลีน
Wolf

18

ที่จริงแล้วลำดับความสำคัญ()สูงกว่าดังนั้นจึงประเมินก่อน:

ประการแรก("1")รับการประเมินด้วยวิธีต่อไปนี้:

("1")                     ==> "1"
("1","2")                 ==> "2"
("1","2","3")             ==> "3"
("1"+"2","2"+"2","3"+"2") ==> "32"
(2+3+6)                   ==>  11

ข้อความข้างต้นจึงเทียบเท่ากับ:

return "1";

เห็นภาพ:

viusal

ดังนั้นโดยทั่วไปจึงไม่มีความแตกต่างในการทำงาน แต่อันที่สองอาจช้าเล็กน้อยเล็กน้อยเนื่องจากในตอนแรกแก้วงเล็บ


2
เหตุใดคุณจึงยืนยันที่ไม่ได้รับการยืนยันอย่างสมบูรณ์ว่า "ข้อที่สองอาจช้ากว่าเล็กน้อย" ในเมื่อไม่เป็นเช่นนั้น

9

ไม่มีความแตกต่างอย่างแน่นอน หากคุณจะดูข้อกำหนด JS (ECMAScript) ของคำสั่งreturn เหนือสิ่งอื่นใดมันกำลังบอกคุณ:

กลับ [ไม่มี LineTerminator ที่นี่] นิพจน์;

ที่คุณสามารถระบุนิพจน์returnได้ แสดงออกhello, Math.abs(x), yourCustomFunc(7)หรือในกรณีที่สองของคุณนี้สามารถหรือ1 (1)การแสดงออก1หลังจากการประเมินผลเป็นเช่นเดียวกับ(1)และเช่นเดียวกับหรือแม้กระทั่งเป็นบางสิ่งบางอย่างที่แปลกประหลาดชอบ(((((1))))))(+(!(+(!1))))


1
+1 สำหรับการอ้างอิงอย่างเป็นทางการ ไม่มีการอ้างอิงแบบทีละหน้า? - HTML หน้าเดียวโหลดนานมาก
Wolf

@ หมาป่าฉันไม่พบเช่นนั้น นี่เป็นอีกหนึ่งเพจ แต่ก็เป็นเพจหนึ่งpeople.mozilla.org/~jorendorff/…
Salvador Dali

ใช่เศร้า ฉันก็ไม่ประสบความสำเร็จ สิ่งที่เกี่ยวกับการขยายคำพูดของคุณไปยังไวยากรณ์ทั้งหมดของคำสั่งส่งคืน?
Wolf

9

ไม่มีความแตกต่างวงเล็บเป็นทางเลือก ดูMSDN :

return[(][expression][)];

อาร์กิวเมนต์นิพจน์ที่เป็นทางเลือกคือค่าที่จะส่งคืนจากฟังก์ชัน หากไม่ระบุฟังก์ชันจะไม่ส่งคืนค่า

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


8
เฉพาะ MS จะคิดว่าจะทำให้การจัดกลุ่ม "ตัวเลือก" ในคำสั่งกลับ ซึ่งเป็น "ทางเลือก" ในนิพจน์ใด ๆ หรือส่วนอื่น ๆ ของไวยากรณ์
RobG

@RobG: แต่เห็นได้ชัดว่าพวกเขามีแนวโน้มที่จะถูกถามในreturnแถลงการณ์มากขึ้น : P MS คงเบื่อที่จะตอบคำถามจาก JS noobs
cHao

2
คำอธิบาย M $ ไม่ถูกต้อง ()ไม่ได้เป็นส่วนหนึ่งของคำสั่งที่ส่งกลับมา
Salman A

4
"มีความแตกต่างสำหรับผู้อ่าน" ใช่: ข้อมูลจำเพาะ MSDN ส่อว่าผิดreturn (expressionและreturn expression)ถูกกฎหมาย
Jim Balter

2
@JimBalter พร้อมกับreturn (), return (และreturn ): P
พอล

9

returnเป็นคำสั่ง คำหลักที่เริ่มต้นคำสั่งที่ส่งกลับมา , ไม่ได้ฟังก์ชั่น

ตามที่ได้รับการกล่าวถึงในวงเล็บเป็นพิเศษส่งผลกระทบต่อการประเมินผลการสั่งซื้อ แต่ไม่ได้ใช้ "รัน" returnฟังก์ชั่นที่มีชื่อว่า นั่นคือเหตุผลที่สายงานเหล่านี้ทำงานได้โดยไม่มีปัญหา:

return (1);
var a = (1);

มีผลเหมือนกับบรรทัดเหล่านี้:

return 1;
var a = 1;

เหตุผลที่ทำให้return()เกิดข้อผิดพลาดทางไวยากรณ์เป็นเหตุผลที่แท้จริงบรรทัดต่อไปนี้แสดงข้อผิดพลาด (รวมคำสั่งส่งคืนเพื่อเปรียบเทียบ):

return();    // SyntaxError: syntax error
var a = ();  // SyntaxError: syntax error

และเช่นเดียวกับที่ทราบด้านถ้าไม่รวมอะไรหลังจากมันถือว่าคุณต้องการที่จะกลับมาreturn undefined
IQAndreas

@Wolf นิพจน์เป็นทางเลือกดังนั้นreturnโดยตัวมันเองคือคำสั่ง return
พอล

6

มีความแตกต่างอย่างมากสำหรับมนุษย์และความแตกต่างเป็นศูนย์สำหรับเอ็นจิ้น Javascript

return 1เป็นคำสั่งที่ประกาศว่าเราจำเป็นต้องออกจากฟังก์ชันที่ให้ค่า 1 ทันที

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

ขณะที่ผู้คนอีกหลายคนที่มีอยู่แล้วได้อย่างถูกต้องกล่าวว่าวงเล็บทำอะไรยกเว้น "กลุ่ม" 1ที่มีความสำคัญสูงขึ้นตามตัวอักษรหมายเลข


3
"มีความแตกต่างอย่างมากสำหรับมนุษย์" - ไม่ใช่คนที่มีความสามารถ "คำสั่งเดียวกันที่ปลอมตัวเป็นการเรียกฟังก์ชัน" - ไม่มีreturnฟังก์ชัน "หลักการงี่เง่าที่คุณไม่จำเป็นต้องใส่ช่องว่างนอกวงเล็บใน Javascript" - แทบไม่ต้องใช้ภาษาใดเลย การเรียกคนงี่เง่านี้ว่างี่เง่า "ผู้ดูแลใด ๆ จะมาที่สำนักงานของคุณพร้อมกับเสาเข็มและคบเพลิง" - ไม่มีใครสามารถ return(1)เป็นการปฏิบัติที่ไม่ดี แต่คนที่ไม่พอใจกับสิ่งเหล่านี้กำลังสิ้นเปลืองทรัพยากรและสร้างบรรยากาศที่ไม่ดี
Jim Balter

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

2
คุณจึงไม่รู้ว่า "ภาระผูกพัน" หมายถึงอะไรหรือคุณกำลังเปลี่ยนการอ้างสิทธิ์ ... ไม่ว่าจะด้วยวิธีใดฉันจะไม่เสียเวลากับคุณอีกต่อไป
Jim Balter

ฉันสงสัยในประโยคสุดท้ายของคุณ returnมี (ในทุกภาษาที่ฉันรู้ว่ามีคำหลักนี้) มีความสำคัญน้อยที่สุด ดังนั้นหากมีนิพจน์ที่เป็นทางเลือกจะถูกประเมินก่อนเสมอ
Wolf

4

ในคำสั่ง return วงเล็บรอบ ๆ นิพจน์ถูกสร้างขึ้นแล้ว

ใน JavaScript เช่นเดียวกับในภาษาอื่น ๆ (เช่น C, C ++, Java, Python) คำสั่ง return มีสองส่วนคือคีย์เวิร์ดreturnและนิพจน์ (ไม่บังคับ) ดังนั้นในทุกกรณีสิ่งที่เป็นไปตามreturnคำหลักคือแรกประเมินว่าการแสดงออกหลังจากนั้นคำสั่งกลับคือ "ดำเนินการ" โดยผ่านการควบคุมกลับไปยังผู้โทร

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

ภาคผนวกในภายหลัง

ถ้ามีวงเล็บหรือไม่มีอย่าลืมใส่นิพจน์เสริมไว้ข้างหลังreturnนั่นคือในบรรทัดเดียวกัน อันตรายจริงที่มีreturnอยู่ในความมุสา JavaScript ในการเพิ่มตัวแบ่งบรรทัดหลังจากที่มัน:

function test() {
  return 
  1;
}

... เพราะข้างต้นฟังก์ชั่นจะกลับมาtestundefined


1

ด้วยการเพิ่มวงเล็บเราได้ตรวจสอบให้แน่ใจว่า javascript ไม่ได้แทรกอัฒภาคก่อนข้อความจำนวนมากที่เขียนหลังจากส่งคืนสำหรับการอ้างอิง: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar #Automatic_semicolon_insertion

ตัวอย่าง :

return a + b;

ถูกเปลี่ยนเป็น

return; a + b;

โดย ASI.

คอนโซลจะเตือน "รหัสที่ไม่สามารถเข้าถึงได้หลังจากคำสั่งส่งคืน" เพื่อหลีกเลี่ยงปัญหานี้ (เพื่อป้องกัน ASI) คุณสามารถใช้วงเล็บ:

return ( a + b );
คัดลอกรหัสจาก: - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return


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