ฉันไม่สามารถเข้าใจกฎทั้งสามข้อในรายละเอียดได้ดีเกินไป - หวังว่าจะมีบางสิ่งที่เป็นภาษาอังกฤษธรรมดา ๆ มากกว่านี้ - แต่นี่คือสิ่งที่ฉันรวบรวมจาก JavaScript: The Definitive Guide, 6th Edition, David Flanagan, O'Reilly, 2011:
อ้างถึง:
JavaScript ไม่ถือว่าการแบ่งบรรทัดทุกครั้งเป็นเครื่องหมายอัฒภาค: โดยทั่วไปจะถือว่าการแบ่งบรรทัดเป็นเครื่องหมายอัฒภาคเฉพาะในกรณีที่ไม่สามารถแยกรหัสโดยไม่มีเครื่องหมายอัฒภาค
อ้างอีก: สำหรับรหัส
var a
a
=
3 console.log(a)
JavaScript ไม่ถือว่าการแบ่งบรรทัดที่สองเป็นเซมิโคลอนเนื่องจากสามารถแยกวิเคราะห์คำสั่งที่ยาวขึ้น a = 3;
และ:
ข้อยกเว้นสองข้อสำหรับกฎทั่วไปที่ JavaScript ตีความการแบ่งบรรทัดเป็นเซมิโคลอนเมื่อไม่สามารถแยกบรรทัดที่สองเป็นการต่อเนื่องของคำสั่งในบรรทัดแรก ข้อยกเว้นแรกเกี่ยวข้องกับคำสั่ง return, break และ Continue
... หากมีการขึ้นบรรทัดใหม่หลังจากคำใดคำหนึ่งเหล่านี้ ... JavaScript จะแปลความหมายของการแบ่งบรรทัดเป็นอัฒภาคเสมอ
... ข้อยกเว้นที่สองเกี่ยวข้องกับตัวดำเนินการ ++ และ ... ... หากคุณต้องการใช้ตัวดำเนินการเหล่านี้เป็นตัวดำเนินการ postfix จะต้องปรากฏในบรรทัดเดียวกับนิพจน์ที่ใช้ มิเช่นนั้นตัวแบ่งบรรทัดจะถูกใช้เป็นเครื่องหมายอัฒภาคและ ++ หรือ - จะถูกแยกวิเคราะห์เป็นตัวดำเนินการส่วนนำหน้าที่ใช้กับรหัสที่ตามมา พิจารณารหัสนี้ตัวอย่างเช่น:
x
++
y
มันถูกแยกวิเคราะห์ว่าx; ++y;
ไม่ใช่x++; y
ดังนั้นฉันคิดว่าจะทำให้มันง่ายขึ้นนั่นหมายความว่า:
โดยทั่วไป, JavaScript จะรักษามันเป็นความต่อเนื่องของรหัสตราบใดที่มันทำให้รู้สึก - ยกเว้น 2 กรณีคือ (1) หลังจากที่คำหลักบางอย่างเช่นreturn
, break
, continue
และ (2) ถ้ามันเห็น++
หรือ--
ในบรรทัดใหม่แล้วมันจะเพิ่ม;
ที่ท้ายบรรทัดก่อนหน้านี้
ส่วนที่เกี่ยวกับ "ถือว่าเป็นความต่อเนื่องของรหัสตราบใดที่มันสมเหตุสมผล" ทำให้รู้สึกเหมือนการจับคู่โลภของนิพจน์ปกติ
จากที่กล่าวมาข้างต้นหมายความว่าเมื่อreturn
มีการขึ้นบรรทัดใหม่ล่าม JavaScript จะแทรก a;
(เสนอราคาอีกครั้ง: หากมีตัวแบ่งบรรทัดปรากฏหลังจากคำใด ๆ เหล่านี้ [เช่น return
] ... JavaScript จะตีความตัวแบ่งบรรทัดนั้นเป็นเครื่องหมายอัฒภาคเสมอ)
และด้วยเหตุนี้จึงเป็นตัวอย่างคลาสสิกของ
return
{
foo: 1
}
จะไม่ทำงานตามที่คาดไว้เพราะล่าม JavaScript จะถือว่าเป็น:
return; // returning nothing
{
foo: 1
}
จะต้องไม่มีการขึ้นบรรทัดใหม่ทันทีหลังจากreturn
:
return {
foo: 1
}
เพื่อให้ทำงานได้อย่างถูกต้อง และคุณสามารถแทรก;
ตัวคุณเองได้หากคุณต้องปฏิบัติตามกฎการใช้;
คำสั่งหลังคำสั่งใด ๆ :
return {
foo: 1
};