ในแนวคิดดั้งเดิมมีความเชื่อกันว่าฟังก์ชั่น JavaScript ผ่านการอ้างอิงผ่านการอ้างอิง (เรียกอีกอย่างว่าตัวชี้ผ่าน) และบางคนเชื่อว่าทั้งค่าผ่านและการอ้างอิงมีอยู่ แล้วเกิดอะไรขึ้นกับพารามิเตอร์ JS ในความเป็นจริงการสาธิตต่อไปนี้สามารถใช้ใน Java
ก่อนอื่นมารับประเภทการจัดส่งขั้นพื้นฐานที่ง่ายกว่า:
ฟังก์ชั่นเพิ่ม (num) {num+= 10; return num;} num = 10; การแจ้งเตือน (เพิ่ม (num)); aelrt (num); // output 20,10สำหรับเอาท์พุท 20 และ 10 ที่นี่ตามคำอธิบายอย่างเป็นทางการของ JS การดำเนินการคัดลอกจะทำเมื่อพารามิเตอร์ประเภทพื้นฐานถูกส่งผ่านเพื่อให้ตัวแปรที่ประกาศจากภายนอกและพารามิเตอร์ฟังก์ชันมีค่าเท่ากัน แต่มีที่อยู่พารามิเตอร์ที่แตกต่างกันอย่างสิ้นเชิง ไม่มีใครรู้จักกันและพารามิเตอร์ฟังก์ชัน Num Stack Frame จะปรากฏขึ้นเมื่อการเรียกใช้ฟังก์ชันส่งคืน ดังนั้นการเปลี่ยนพารามิเตอร์ฟังก์ชั่น num ไม่มีผลต่อตัวแปรภายนอกดั้งเดิม
ลองดูที่การอ้างอิงประเภทวัตถุที่ซับซ้อนมากขึ้น:
ฟังก์ชั่น setName (obj) {obj.name = "ted";} var obj = วัตถุใหม่ (); setName (obj);สาระสำคัญของรหัสด้านบนคือ: สร้างวัตถุวัตถุกำหนดอ้างอิงถึง OBJ (ใน C มันคือการกำหนดที่อยู่หน่วยความจำโดยตรง) และจากนั้นเมื่อผ่านพารามิเตอร์ฟังก์ชันฉันทำสิ่งเดียวกันกับวิธีก่อนหน้านี้คัดลอกเฟรมสแต็กไปยัง OBJ ของพารามิเตอร์ฟังก์ชัน Java) และหลังจากการเปลี่ยนแปลงเสร็จสิ้นเฟรมสแต็กที่สอดคล้องกับพารามิเตอร์ฟังก์ชัน OBJ จะต้องโผล่ขึ้นมาด้วย
ดังนั้นเอาต์พุตที่สอดคล้องกันคือค่าของวัตถุวัตถุหลังจากเปลี่ยน
จากนั้นเพื่อนบางคนอาจถามว่าสิ่งนี้สามารถเข้าใจได้ว่าเป็นบัตรอ้างอิง (Pointer Pass)? ไม่พูดอย่างเคร่งครัดในภาษาที่คล้ายกับ Java ไม่มีตัวชี้ ใน Java กระบวนการข้างต้นเรียกว่ากระบวนการแยกวิเคราะห์จากการอ้างอิงเชิงสัญลักษณ์ถึงการอ้างอิงโดยตรง ใน C ตัวชี้เป็นประเภทที่มีความยาวคงที่ (2 ไบต์ในคอมไพเลอร์ C ส่วนใหญ่) แต่ในภาษาที่คล้ายกัน Java การอ้างอิงยังมีคุณสมบัติและวิธีการของตัวเอง แต่คุณไม่สามารถเข้าถึงและควบคุมได้โดยตรงดังนั้นจึงเป็นวัตถุในแง่หนึ่ง กลไกนี้ยังหลีกเลี่ยงการรั่วไหลของหน่วยความจำอย่างมากและคำนี้เรียกว่ากลไกการเข้าถึงที่มีโครงสร้างของหน่วยความจำ
เพื่อพิสูจน์จุดด้านบนตัวอย่างด้านบนได้รับการแก้ไขเล็กน้อย:
ฟังก์ชั่น setName (obj) {obj.name = "ted"; obj = วัตถุใหม่ (); obj.name = "mary";} var obj = วัตถุใหม่ (); setName (obj); แจ้งเตือน (obj.name); // output tedความแตกต่างเพียงอย่างเดียวระหว่างตัวอย่างนี้และตัวอย่างก่อนหน้าคือวัตถุใหม่ถูกกำหนดให้กับพารามิเตอร์ฟังก์ชัน OBJ เพื่อให้พารามิเตอร์ฟังก์ชัน OBJ และพารามิเตอร์อ้างอิง OBJ ดั้งเดิมมีค่าและที่อยู่หน่วยความจำที่แตกต่างกันอย่างสมบูรณ์
บทความข้างต้นพูดสั้น ๆ เกี่ยวกับว่าพารามิเตอร์ฟังก์ชั่น JavaScript ผ่านการส่งผ่านหรือผ่านการอ้างอิงเป็นเนื้อหาทั้งหมดที่ฉันได้แชร์กับคุณ ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น