พารามิเตอร์ฟังก์ชันจะปรากฏในสองตำแหน่ง คือ ตำแหน่งการกำหนดฟังก์ชันและตำแหน่งการเรียกใช้ฟังก์ชัน พารามิเตอร์ในทั้งสองตำแหน่งจะแตกต่างกัน
พารามิเตอร์ที่เป็นทางการ (พารามิเตอร์ที่เป็นทางการ)
พารามิเตอร์ที่ปรากฏในคำจำกัดความของฟังก์ชันสามารถถือเป็นตัวยึดตำแหน่งได้ โดยจะไม่มีข้อมูลและสามารถรอจนกว่าฟังก์ชันจะถูกเรียกเพื่อรับข้อมูลที่ส่งผ่าน จึงเรียกว่าพารามิเตอร์ที่เป็นทางการ หรือที่เป็นทางการ พารามิเตอร์สำหรับระยะสั้น
พารามิเตอร์จริง (พารามิเตอร์จริง)
พารามิเตอร์ที่กำหนดเมื่อเรียกใช้ฟังก์ชันประกอบด้วยข้อมูลจริงและจะถูกใช้โดยโค้ดภายในฟังก์ชัน ดังนั้นจึงเรียกว่าพารามิเตอร์จริง หรือเรียกสั้น ๆ ว่าพารามิเตอร์จริง
ความแตกต่างและการเชื่อมต่อระหว่างพารามิเตอร์ที่เป็นทางการและพารามิเตอร์จริง
1) ตัวแปรพารามิเตอร์ที่เป็นทางการจะจัดสรรหน่วยความจำเมื่อมีการเรียกใช้ฟังก์ชันเท่านั้น หลังจากการโทรเสร็จสิ้น หน่วยความจำจะถูกปล่อยทันที ดังนั้นตัวแปรพารามิเตอร์ที่เป็นทางการจึงใช้ได้เฉพาะภายในฟังก์ชันและ ไม่สามารถใช้นอกฟังก์ชั่นได้
2) พารามิเตอร์จริงอาจเป็นค่าคงที่ตัวแปรนิพจน์ฟังก์ชั่นและอื่น ๆ ดังนั้นคุณควรใช้การกำหนดอินพุตและวิธีการอื่น ๆ ล่วงหน้าเพื่อรับค่าที่แน่นอนสำหรับพารามิเตอร์จริง
3) พารามิเตอร์จริงและพารามิเตอร์ที่เป็นทางการจะต้องสอดคล้องกันอย่างเคร่งครัดในจำนวนประเภทและคำสั่งซื้อมิฉะนั้นข้อผิดพลาด "ประเภทไม่ตรงกัน" จะเกิดขึ้น แน่นอนว่าหากการแปลงประเภทอัตโนมัติเป็นไปได้หรือการแปลงประเภทบังคับได้ดำเนินการประเภทพารามิเตอร์จริงอาจแตกต่างจากประเภทพารามิเตอร์ที่เป็นทางการ
4) การถ่ายโอนข้อมูลที่เกิดขึ้นในการเรียกใช้ฟังก์ชันคือทางเดียวและค่าของพารามิเตอร์จริงสามารถถ่ายโอนไปยังพารามิเตอร์ที่เป็นทางการเท่านั้น แต่ค่าของพารามิเตอร์ที่เป็นทางการไม่สามารถถ่ายโอนไปยังพารามิเตอร์จริงในทิศทางย้อนกลับ ในคำอื่น ๆ เมื่อการถ่ายโอนข้อมูลเสร็จสิ้นพารามิเตอร์จริงและพารามิเตอร์ที่เป็นทางการจะไม่เกี่ยวข้องอีกต่อไปดังนั้นในระหว่างการเรียกใช้ฟังก์ชันการเปลี่ยนแปลงค่าของพารามิเตอร์ที่เป็นทางการจะไม่ส่งผลกระทบต่อพารามิเตอร์จริง
5) แม้ว่าพารามิเตอร์ที่เป็นทางการและพารามิเตอร์จริงสามารถมีชื่อเดียวกันได้ แต่ก็เป็นอิสระจากกันและไม่ส่งผลต่อกันและกันเนื่องจากพารามิเตอร์จริงนั้นถูกต้องนอกฟังก์ชันในขณะที่พารามิเตอร์ที่เป็นทางการนั้นถูกต้องภายในฟังก์ชัน
หน้าที่ของพารามิเตอร์ที่เป็นทางการและพารามิเตอร์จริงคือการส่งข้อมูล เมื่อมีการเรียกใช้ฟังก์ชัน ค่าของพารามิเตอร์จริงจะถูกส่งผ่านไปยังพารามิเตอร์ที่เป็นทางการ
ช่วยให้เราสามารถส่งผ่านข้อมูลและข้อมูลที่ผ่านส่งผลกระทบต่อผลลัพธ์การดำเนินการของฟังก์ชั่นทำให้ฟังก์ชั่นมีความยืดหยุ่นและสามารถใช้ซ้ำได้มากขึ้น
ฟังก์ชั่น foo(a, b) { console.log ([a, b]); - foo(1, 2); //
ในตัวอย่างเอาต์พุต [1, 2] นี้ a
และ b
เป็นตัวแปรท้องถิ่นในฟังก์ชันและสามารถเข้าถึงได้ภายในฟังก์ชันเท่านั้น เมื่อเรียกใช้ฟังก์ชันข้อมูลที่ส่งผ่านจะถูกจับคู่ตามตำแหน่งและกำหนดให้กับ a
และ b
ตามลำดับ
เมื่อสร้างฟังก์ชั่นพารามิเตอร์ที่ตั้งค่าไว้ในวงเล็บหลังจากชื่อ function 函数名
ชั่นเรียกว่า พารามิเตอร์อย่างเป็น ทางการ ในตัวอย่างข้างต้น a
และ b
เป็นพารามิเตอร์ที่เป็นทางการ และส่งผ่านใน 1
และ 2
เป็นพารามิเตอร์จริง
เนื่องจากพารามิเตอร์ที่เป็นทางการถูกประกาศตัวแปรจึงไม่สามารถประกาศได้ซ้ำ ๆ ด้วย let
and const
ฟังก์ชั่น foo(a, b) { ให้ A = 1
; ค่าที่เรียกว่าหมายถึงค่าที่เก็บไว้โดยตรงบนตัวแปร นี่เป็นกระบวนการกำหนดโดยนัยดังนั้นเมื่อส่งพารามิเตอร์ไปยังฟังก์ชันมันจะเทียบเท่ากับ การกำหนดค่าจากตัวแปรหนึ่งไปยังตัวแปรอื่น
ค่าดั้งเดิม:
ฟังก์ชั่นเพิ่ม (num) { กลับหมายเลข + 1; - ให้นับ = 5; ให้ result = add(count); // กระบวนการของการส่งผ่านพารามิเตอร์ที่นี่ถือได้ว่าเป็น num = count console.log(นับ); // 5 console.log (ผลลัพธ์); // 6
ค่าอ้างอิง:
ฟังก์ชั่น setName (obj) { obj.name = "เสี่ยวหมิง"; - ให้บุคคล = {}; SetName (บุคคล);console.log
บุคคล)
; การตั้งค่าพารามิเตอร์อย่างเป็นทางการสองตัวเมื่อกำหนดฟังก์ชั่นไม่ได้หมายความว่าพารามิเตอร์สองตัวจะต้องส่งผ่านเมื่อโทร เมื่อโทรมาจริงไม่ว่าจะผ่านพารามิเตอร์หนึ่งหรือสามตัวจะไม่มีการรายงานข้อผิดพลาดแม้ว่าจะไม่มีการส่งพารามิเตอร์ก็ตาม
มี วัตถุคล้ายอาร์เรย์ พิเศษชื่อ arguments
(ไม่ใช่อินสแตนซ์ของ Array
) ในฟังก์ชั่นทั้งหมด (ไม่ใช่ลูกทุ่ง) ซึ่งเก็บสำเนาของพารามิเตอร์จริงทั้งหมด ไปยังวิธีการเข้าถึงดัชนีของค่า คุณยังสามารถเข้าถึงคุณสมบัติ arguments.length
เพื่อกำหนดจำนวนพารามิเตอร์ที่ส่งผ่านเมื่อมีการเรียกใช้ฟังก์ชันจริง
ตัวอย่างเช่น:
ฟังก์ชัน foo(a, b) { console.log(อาร์กิวเมนต์[0]); console.log (อาร์กิวเมนต์ [1]); console.log (อาร์กิวเมนต์ความยาว); - foo(10, 20); // เอาต์พุต 10, 20, 2 ตามลำดับ
ในตัวอย่างข้างต้น พารามิเตอร์แรกของฟังก์ชัน foo() คือ a และพารามิเตอร์ตัวที่สองคือ b ซึ่งสามารถแยกได้จากอาร์กิวเมนต์ x] ค่าเดียวกัน ดังนั้นคุณสามารถประกาศฟังก์ชั่นโดยไม่ต้องตั้งค่าพารามิเตอร์อย่างเป็นทางการ
ฟังก์ชั่นฟู() { console.log(อาร์กิวเมนต์[0]); console.log(อาร์กิวเมนต์[1]); - foo(10, 20); // เอาต์พุต 10 และ 20 ตามลำดับ
จะเห็นได้ว่าพารามิเตอร์ที่เป็นทางการของฟังก์ชัน JavaScript ถูกเขียนเพื่อความสะดวกเท่านั้น การผ่านพารามิเตอร์ให้มากที่สุดเท่าที่คุณต้องการจะไม่ทำให้เกิดข้อผิดพลาด
สิ่งที่ควรทราบอีกประการหนึ่งคือ arguments
สามารถใช้ร่วมกับพารามิเตอร์ที่เป็นทางการได้ และค่าในออบเจ็กต์ arguments
จะถูกซิงโครไนซ์กับพารามิเตอร์ที่เป็นทางการที่เกี่ยวข้อง ตัวอย่างเช่น:
ฟังก์ชัน foo(a) { ข้อโต้แย้ง [0]++; console.log(ก); - foo(10); // เอาต์พุต 11 - ฟังก์ชั่น foo2 (a) { A ++; console.log(อาร์กิวเมนต์[0]); -FOO2
(
10);
นี่ไม่ได้หมายความว่าพวกเขาจะเข้าถึงที่อยู่หน่วยความจำเดียวกันหลังจากทั้งหมดเราผ่านไปในค่าดั้งเดิม พวกเขายังคงแยกจากกันในหน่วยความจำ แต่ค่าของพวกเขาจะถูกเก็บไว้ในการซิงค์เนื่องจากกลไกภายใน
นอกจากนี้ หากพารามิเตอร์หายไป ค่าของพารามิเตอร์ที่เป็นทางการนี้จะไม่ถูกซิงโครไนซ์กับค่าที่สอดคล้องกันในอ arguments
ตัวอย่างเช่น ในตัวอย่างต่อไปนี้ มีการส่งผ่านพารามิเตอร์เพียงตัวเดียว ดังนั้นจึงมีค่าพารามิเตอร์จริงเพียงค่าเดียวใน arguments
ในขณะนี้ หากอาร์กิวเมนต์ [1] ถูกตั้งค่าเป็นค่าที่แน่นอนในฟังก์ชัน ค่านี้จะไม่ถูกซิงโครไนซ์ ไปยังพารามิเตอร์ที่เป็นทางการที่สองตัวอย่างเช่น:
ฟังก์ชัน foo (a, b) { อาร์กิวเมนต์ [1] = 2; console.log(ข); - foo(1); // Output undefinition
ในตัวอย่างนี้ พารามิเตอร์ที่เป็นทางการ b ไม่มีพารามิเตอร์จริงที่ส่งผ่านเข้ามา และค่าของมันจะเริ่มต้นเป็น undefined
แต่ถ้า:
foo(1, undefinition); //
เมื่อเอาต์พุต 2 ถูกส่งผ่านด้วยตนเองใน undefined
องค์ประกอบที่มีค่า undefined
จะปรากฏในอาร์เรย์ arguments
ซึ่งยังคงสามารถซิงโครไนซ์กับค่า b ได้
ใน โหมดเข้มงวด ค่าและพารามิเตอร์ที่เป็นทางการในออบเจ็ arguments
จะไม่ถูกซิงโครไนซ์อีกต่อไป แน่นอนว่าหากมีการส่งผ่านค่าอ้างอิง ค่าเหล่านั้นจะยังคงส่งผลกระทบซึ่งกันและกัน แต่นี่เป็นเพียงลักษณะของค่าอ้างอิงเท่านั้น ดังนั้นจึงเป็นการดีที่สุดที่จะไม่พึ่งพากลไกการซิงโครไนซ์นี้ในระหว่างการพัฒนานั่นคืออย่าใช้พารามิเตอร์ที่เป็นทางการและค่าที่เกี่ยวข้องในวัตถุ arguments
ในเวลาเดียวกัน
ไม่มีอาร์กิวเมนต์ในฟังก์ชันลูกศร
หากฟังก์ชันถูกกำหนดโดยใช้ไวยากรณ์ของลูกศร จะไม่มีอ็อบเจ็กต์อาร์กิวเมนต์ในฟังก์ชันและสามารถเข้าถึงได้ผ่านพารามิเตอร์ที่เป็นทางการที่กำหนดไว้เท่านั้น
ให้ foo = () => { console.log(อาร์กิวเมนต์[0]); } foo (
)
arguments
ให้ fn2 = () => { console.log(อาร์กิวเมนต์[0]); - fn2 (); } FN1 (5);
แต่ arguments
arguments
เหล่านี้ไม่ได้มาจากฟังก์ชันลูกศร แต่เป็นของ arguments
ธรรมดาภายนอก
จริง ข้อ จำกัด ของพารามิเตอร์ที่ผ่านคำสั่ง?
เนื่องจากแอตทริบิวต์ของวัตถุไม่ได้เรียงลำดับค่าที่สอดคล้องกันจะถูกกำหนดโดยชื่อแอตทริบิวต์ ดังนั้นคุณสามารถส่งผ่านในวัตถุและใช้คุณสมบัติในวัตถุเป็นพารามิเตอร์จริงดังนั้นลำดับของพารามิเตอร์จึงไม่สำคัญ
ฟังก์ชั่น foo (obj) { console.log (obj.name, obj.sex, obj.age); -foo ({เพศ: 'ชาย',
:
18, ชื่อ: 'Xiao Ming'});
ของพารามิเตอร์ที่เป็นทางการ undefined
บางครั้งเราต้องการตั้งค่าเริ่มต้นที่เฉพาะ
เจาะจง ชื่อ = ชื่อ ||. 'ทุกคน'; console.log( 'สวัสดี ' + ชื่อ + '!'); - Sayhi ()
false
พารามิเตอร์จริงจะไม่ทำงาน หากคุณต้องการความแม่นยำมากขึ้นคุณสามารถใช้คำสั่ง if
หรือนิพจน์ ternary เพื่อพิจารณาว่าพารามิเตอร์มีค่าเท่ากับที่ undefined
ไม่ ถ้า (ชื่อ === ไม่ได้กำหนด) { ชื่อ = 'ทุกคน'; - console.log( 'สวัสดี ' + ชื่อ + '!'); - // ฟังก์ชั่นการตัดสินการแสดงออกของ Ternary Sayhi (ชื่อ) { ชื่อ = (ชื่อ! == ไม่ได้กำหนด) ชื่อ: 'ทุกคน'; console.log ('hello' + name + '!'); }
ES6 นั้นสะดวกกว่ามากเพราะรองรับวิธีที่ชัดเจนในการตั้งค่าค่าเริ่มต้นเช่นนี้:
ฟังก์ชั่น sayhi (name = 'ทุกคน') {// เมื่อกำหนดฟังก์ชันให้กำหนดค่าโดยตรงให้กับพารามิเตอร์ที่เป็นทางการคอนโซล log ( 'สวัสดี' + ชื่อ + '!'); - Sayhi (); Sayhi ('Tony'); Sayhi (ไม่ได้กำหนด)
undefined
ค่าเริ่มต้นไม่เพียงแต่เป็นค่าเท่านั้น แต่ยังเป็นนิพจน์ทางกฎหมายใดๆ ก็ได้ แม้กระทั่งการเรียกใช้ฟังก์ชัน:
function sayHi(name = 'every'+'one') { console.log( 'สวัสดี ' + ชื่อ + '!'); - sayHi(); // เอาท์พุท 'สวัสดีทุกคน!' - ฟังก์ชั่นฟู() { console.log('กำลังโทรหา'); กลับ 'โทนี่'; - ฟังก์ชั่น sayHi (ชื่อ = foo()) { console.log( 'สวัสดี ' + ชื่อ + '!'); - sayHi(); // เอาต์พุต 'call foo' // เอาท์พุท 'สวัสดีโทนี่!' sayHi (ไม่ได้กำหนด); // เอาต์พุต 'call foo' // เอาท์พุท 'สวัสดีโทนี่!' Sayhi ('John')
undefined
evaluated when the function is defined. .
โดยปกติแล้วเราจะตั้งค่าเริ่มต้นสำหรับพารามิเตอร์เพื่อให้เราสามารถละเว้นพารามิเตอร์ได้อย่างเหมาะสมเมื่อเรียกใช้ฟังก์ชัน เป็นไปไม่ได้ที่จะละเว้น
ฟังก์ชั่น fn (x = 1, y) { console.log ([x, y]); - fn (); FN (2); FN (, 2); FN (ไม่ได้กำหนด, 2);
ในตัวอย่างข้างต้นค่าเริ่มต้นที่ตั้งค่าสำหรับพารามิเตอร์ที่เป็นทางการ X ดูเหมือนจะไม่มีความหมาย ดังนั้นจึงเป็นการดีที่สุดที่จะใส่พารามิเตอร์ที่มีค่าเริ่มต้นไว้ท้าย:
ฟังก์ชั่น fn (x, y = 2) { console.log ([x, y]); - fn (); FN (1); FN (1, 1) // เอาต์พุต [1, 1]ปัญหาการละเว้นพารามิเตอร์
เมื่อพารามิเตอร์หลายตัวมีค่าเริ่มต้นปัญหาจะเกิดขึ้นอีกครั้ง
ฟังก์ชั่น fn (x, y = 2, z = 3) { console.log ([x, y, z]); - FN (1, 10) // รายงานข้อผิดพลาด
เรารู้ก่อนหน้านี้ว่าเราสามารถหลีกเลี่ยงข้อ จำกัด ของคำสั่งพารามิเตอร์โดยส่งผ่านในวัตถุ จะใช้ค่าเริ่มต้นพารามิเตอร์ได้อย่างไร? การใช้ ||
if
คำสั่งหรือการแสดงออกที่สามเพื่อตัดสินก็เป็นวิธีแก้ปัญหาเช่นกัน แต่ดูเหมือนว่าจะย้อนกลับไปเล็กน้อย ถัดไปเป็นอีกสองวิธีใหม่ใน ES6
ค่าเริ่มต้นพารามิเตอร์ใช้ร่วมกับ Object.assign ()
ฟังก์ชั่น fn (obj = {}) { ให้ defaultObj = { X: ไม่ได้กำหนด y: 2, z: 3 - ให้ผลลัพธ์ = Object.assign(defaultObj, obj); console.log ([result.x, result.y, result.z]); - fn (); fn ({x: 1, z: 10});
ในตัวอย่างข้างต้นวัตถุ defaultObj
ถูกกำหนดไว้ในฟังก์ชันและคุณสมบัติในนั้นถูกใช้เป็นค่าเริ่มต้นของพารามิเตอร์ คุณสมบัติใน defaultObj จะเป็นคุณลักษณะเดียวกันของ OBJ ถูกแทนที่ ที่นี่มีตัวแปรที่ใช้เพื่อรับวัตถุที่กลับมารวมกัน
ในเวลาเดียวกันค่าเริ่มต้นของพารามิเตอร์อย่างเป็นทางการ obj
ยังถูกตั้งค่าเป็นวัตถุว่างเพื่อป้องกันไม่ให้พารามิเตอร์ใดถูกส่งผ่านเมื่อเรียกใช้ฟังก์ชันเนื่องจากจะ undefined
พารามิเตอร์ที่สองที่ได้รับจาก Object.assign () ส่งผลให้เกิดข้อผิดพลาด
ค่าเริ่มต้นของพารามิเตอร์และการกำหนดโครงสร้างการทำลายจะใช้ร่วมกัน
เมื่อมีการเรียกฟังก์ชันการจับคู่ของพารามิเตอร์จริงและพารามิเตอร์ที่เป็นทางการนั้นเป็นกระบวนการกำหนดโดยนัย
ฟังก์ชั่น fn ({x, y = 2, z = 3}) { console.log ([x, y, z]); - fn ({}); fn ({x: 1, z: 10});
ในตัวอย่างนี้จะใช้เฉพาะค่าเริ่มต้นของการกำหนดโครงสร้างการทำลายของวัตถุและไม่ได้ใช้ค่าเริ่มต้นของพารามิเตอร์ฟังก์ชัน หากไม่มีการส่งพารามิเตอร์เมื่อมีการเรียกใช้ฟังก์ชันข้อผิดพลาดจะถูกรายงานเนื่องจากสิ่งนี้จะทำให้การกำหนดโครงสร้างการทำลายล้มเหลวในระหว่างการเริ่มต้นพารามิเตอร์ซึ่งเทียบเท่ากับการเรียกใช้รหัสเช่น {x, y = 2, z = 3} = undefined
ในทำนองเดียวกันคุณสามารถใช้ไวยากรณ์ของค่าเริ่มต้นพารามิเตอร์เพื่อตั้งค่าวัตถุ destructuring เริ่มต้นสำหรับ {x, y = 2, z = 3}
ดังนั้นฟังก์ชั่นโดยไม่ต้องผ่านพารามิเตอร์สามารถดำเนินการได้อย่างราบรื่น:
ฟังก์ชั่น fn ({x, y = 2, z = 3} = {}) { console.log ([x, y, z]); - fn ();
มีค่าเริ่มต้นสองเท่าที่นี่ ซึ่ง อาจทำให้เกิดความสับสนเล็กน้อย
if (พารามิเตอร์จริง === {... }) {// เมื่อ fn ({... }); {x, y = 2, z = 3} = {... }; } อื่นถ้า (พารามิเตอร์จริง === ไม่ได้กำหนด) {// เมื่อ fn (); {x, y = 2, z = 3} = {}; -
มีรายละเอียดหนึ่งที่ต้องการความสนใจเป็นพิเศษกับค่าเริ่มต้นสองเท่าซึ่งเป็นความแตกต่างระหว่างค่าเริ่มต้นของการกำหนดโครงสร้างการกำหนดและค่าเริ่มต้นของพารามิเตอร์ฟังก์ชัน
ฟังก์ชั่น fn ({x = 1} = {}, {y} = {y: 2}) { console.log (x, y); - fn (); fn ({x: 10}, {y: 20}); fn ({}, {});
ในฟังก์ชั่นนี้มีพารามิเตอร์สองชุดที่ใช้การกำหนดโครงสร้าง เมื่อพารามิเตอร์ผ่านคือ {}
, y ไม่ได้รับค่าเริ่มต้น 2. ทำไมจึงเป็นเช่นนี้? รวมกับตัวอย่าง pseudocode ก่อนหน้า:
fn ({x: 10}, {y: 20}); fn ({}, {});
เมื่อพารามิเตอร์ที่ส่งผ่านคือ {}
พารามิเตอร์ฟังก์ชันจะไม่หายไปหรือ undefined
ดังนั้นค่าเริ่มต้นของพารามิเตอร์ฟังก์ชันไม่มีผล ในเวลาเดียวกันไม่มีค่าที่สอดคล้อง undefined
สำหรับ x และ y ใน {}
.
ขอบเขตและโซนตายชั่วคราวของค่าเริ่มต้นพารามิเตอร์
มีรายละเอียดเล็ก (...)
น้อย ๆ
ฟังก์ชั่น foo (a = b) { ให้ b = 1; - foo ();
แต่ขอบเขตนี้เป็นเพียงชั่วคราว
นอกจากนี้ยังเป็นไปตามกฎของขอบเขตธรรมดา:
ให้ b = 2; ฟังก์ชั่น foo (a = b) { ให้ b = 1; กลับ; - foo ();
ในตัวอย่างข้างต้นมีตัวแปรส่วนกลาง B จากนั้นพารามิเตอร์อย่างเป็นทางการ A จะได้รับค่าของตัวแปรส่วนกลาง b
แน่นอนถ้ามีพารามิเตอร์อย่างเป็นทางการ B ในขอบเขตพารามิเตอร์ที่เป็นทางการมันจะได้รับขอบเขตปัจจุบันก่อน:
ให้ b = 2; ฟังก์ชัน foo (b = 3, a = b) { กลับ; - foo ();
ตั้งค่าเริ่มต้นสำหรับพารามิเตอร์หลายตัวพวกเขาจะเริ่มต้นตามลำดับตามกฎของ "โซนตายชั่วคราว" นั่นคือพารามิเตอร์ก่อนหน้านี้ไม่สามารถอ้างถึงพารามิเตอร์ในภายหลัง:
function foo (a = b, b = 2) { กลับ + b; - foo ();
พารามิเตอร์ที่เหลืออยู่
ES6 จัดเตรียมพารามิเตอร์ที่เหลืออยู่ ** (ส่วนที่เหลือ) ** ไวยากรณ์ ( ...变量名
) ซึ่งสามารถรวบรวมพารามิเตอร์จริงซ้ำซ้อนของฟังก์ชัน (นั่นคือพารามิเตอร์จริงที่ไม่สอดคล้องกับพารามิเตอร์ที่เป็นทางการ) ต้องใช้วัตถุ arguments
หากใช้พารามิเตอร์อย่างเป็นทางการกับตัวดำเนินการ ...
มันจะกลายเป็นอาร์เรย์และพารามิเตอร์จริงซ้ำซ้อนจะถูกใส่ลงในอาร์เรย์นี้
การใช้งานขั้นพื้นฐานของพารามิเตอร์ที่เหลืออยู่:
ฟังก์ชั่นผลรวม (a, ... ค่า) { สำหรับ (ให้ val ของค่า) { a += val; - กลับ; - ผลรวม (0, 1, 2, 3);
ในตัวอย่างข้างต้นระหว่างการเริ่มต้นพารามิเตอร์การจับคู่จะดำเนินการก่อนตามตำแหน่งพารามิเตอร์ 0 จะถูกกำหนดให้กับ A จากนั้นพารามิเตอร์ที่เหลือ 1, 2 และ 3 จะถูกใส่ลงในค่าอาร์เรย์
ต่อไปนี้เป็นตัวอย่างการเปรียบเทียบของการใช้วัตถุ arguments
และพารามิเตอร์ที่เหลือเพื่อรับพารามิเตอร์:
// วิธีการเขียนฟังก์ชันอาร์กิวเมนต์ sortNumbers () { return array.prototype.slice.call (อาร์กิวเมนต์) .sort (); - // วิธีการเขียนพารามิเตอร์ที่เหลือ const sortNumbers = (... ตัวเลข) => { return number.sort (); -
จะเห็นได้ว่าพารามิเตอร์ที่เหลือจะถูกเขียนขึ้นอย่างรัดกุมมากขึ้น แม้ว่า arguments
จะเป็นวัตถุคล้ายอาร์เรย์และวัตถุที่วนซ้ำ แต่ก็ไม่ใช่อาร์เรย์หลังจากทั้งหมด Array.prototype.slice.call
arguments
สนับสนุนวิธีการอาร์เรย์
พารามิเตอร์ที่เหลือแตกต่างจาก Array
arguments
และฟังก์ชั่นลูกศรยังรองรับพารามิเตอร์ที่เหลืออยู่
นอกจากนี้การใช้พารามิเตอร์ที่เหลือจะไม่ส่งผลกระทบต่อการทำงานของวัตถุ arguments
มันยังสามารถสะท้อนพารามิเตอร์ที่ส่งผ่านเมื่อเรียกใช้ฟังก์ชัน
ตำแหน่งของพารามิเตอร์ที่เหลืออยู่
พารามิเตอร์ที่เหลือจะต้องเป็นพารามิเตอร์ที่เป็นทางการสุดท้ายมิฉะนั้นจะมีการรายงานข้อผิดพลาด
// ฟังก์ชั่นการรายงานข้อผิดพลาด fn1 (a, ... rest, b) { console.log ([a, b, rest]); - // วิธีที่ถูกต้องในการเขียนฟังก์ชั่น fn2 (a, b, ... พักผ่อน) { console.log ([a, b, rest]); - FN2 (1, 2, 3, 4) // เอาท์พุท [1, 2, [3, 4]]
ขยายไวยากรณ์
ก่อนหน้านี้เรารู้วิธีรวบรวมพารามิเตอร์ซ้ำซ้อนลงในอาร์เรย์ แต่บางครั้งเราต้องทำสิ่งที่ตรงกันข้ามเช่นผ่านองค์ประกอบในอาร์เรย์ไปยังฟังก์ชั่นแยกกันแทนที่จะส่งผ่านในอาร์เรย์เช่นนี้:
ฟังก์ชั่นผลรวม (... ค่า) { ให้ผลรวม = 0; สำหรับ (ให้ val ของค่า) { sum += val; - จำนวนเงินที่ส่งคืน; - ให้ arr = [1, 2, 3, 4]; ผลรวม (arr);
ฟังก์ชั่นในตัวอย่างข้างต้นจะสะสมค่าทั้งหมดที่ผ่านเข้ามาหากเราส่งผ่านในอาร์เรย์โดยตรงเราจะไม่ได้ผลลัพธ์ที่เราต้องการ
ในตัวอย่างหากอาร์เรย์ถูกส่งผ่านค่าของค่าจะกลายเป็น [[1, 2, 3, 4]]
ส่งผลให้มีเพียงองค์ประกอบเดียวในค่าอาร์เรย์และประเภทขององค์ประกอบนี้เป็นอาร์เรย์ . จากนั้นค่าการส่งคืนฟังก์ชั่นเป็นผลมาจากการเพิ่มค่า 0
และอาร์เรย์ [1, 2, 3, 4]
ในการแยกอาร์เรย์ออกไปและส่งผ่านไปยังฟังก์ชั่นมันเป็นไปไม่ได้ที่จะส่งผ่านในพารามิเตอร์ทีละหนึ่ง - sum(arr[0], arr[1], arr[2], arr[3]);
เป็นไปไม่ได้เสมอไปคุณจะรู้ว่ามีองค์ประกอบกี่อย่างในอาร์เรย์และอาจมีองค์ประกอบมากมายในอาร์เรย์
เป็นไปได้มากกว่าที่จะใช้วิธีการสมัคร ():
sum.apply (null, arr);
แต่นี่ยังไม่ใช่ทางออกที่ดีที่สุดดังนั้นนี่คือประเด็นสำคัญ!
ใหม่ ** ขยายไวยากรณ์ (สเปรด) ** ใน ES6 สามารถช่วยเราเผชิญกับสถานการณ์นี้ นอกจากนี้ยังใช้ ...变量名
ตัวแปร
เมื่อเรียกใช้ฟังก์ชันแอปพลิเคชันของมันมีดังนี้:
ผลรวม (... arr); // เทียบเท่ากับผลรวม (1,2,3,4);
มันสามารถใช้กับค่าปกติตามต้องการไม่มีข้อ จำกัด ในตำแหน่งด้านหน้าและด้านหลังและวัตถุที่ทำซ้ำได้หลายรายการสามารถส่งผ่านในเวลาเดียวกัน:
ผลรวม (-1, ... arr); ผลรวม (... arr, 5); ผลรวม (-1, ... arr, 5); ผลรวม (-1, ... arr, ... [5, 6, 7]);
ผู้ดำเนินการขยายตัว ...
เทียบเท่ากับการดำเนินการของพารามิเตอร์ที่ผ่านด้วยตนเองโดยแยกจากกันสำหรับเรา
แม้ว่าตัวอย่างข้างต้นจะมีไว้สำหรับอาร์เรย์ แต่ไวยากรณ์การขยายตัวสามารถทำอะไรได้มากกว่านั้น
พารามิเตอร์อย่างเป็นทางการเป็นตัวแปรท้องถิ่นที่ประกาศในฟังก์ชัน
จำนวนพารามิเตอร์ที่เป็นทางการและพารามิเตอร์จริงอาจไม่เท่ากัน:
●พารามิเตอร์อย่างเป็นทางการที่มีพารามิเตอร์จริงที่ขาดหายไปจะได้รับค่าเริ่มต้น undefined
●พารามิเตอร์จริงเพิ่มเติมสามารถเข้าถึงได้ผ่านวัตถุ arguments
ยกเว้นฟังก์ชั่นลูกศร
คุณสามารถส่งผ่านในวัตถุเพื่อให้คำสั่งของพารามิเตอร์ผ่านไม่สำคัญอีกต่อไปและให้คุณสมบัติในวัตถุถูกใช้เป็นพารามิเตอร์จริง
ค่าเริ่มต้นพารามิเตอร์ของ ES6 - ค่าเริ่มต้นจะได้รับเฉพาะในกรณีที่ค่าพารามิเตอร์หายไปหรือ undefined
เมื่อเรียกใช้ฟังก์ชัน
●พารามิเตอร์ที่ตั้งค่าเริ่มต้นสามารถละเว้นได้เฉพาะในกรณีที่วางไว้ในตำแหน่งสุดท้าย
●ค่าเริ่มต้นของการตั้งค่าพารามิเตอร์อย่างเป็นทางการไม่สามารถอ้างถึงตัวแปรในตัวแปรฟังก์ชัน แต่สามารถอ้างถึงพารามิเตอร์ที่เป็นทางการก่อนหน้าและตัวแปรภายนอก
●การใช้ค่าเริ่มต้นผ่าน object.assign () หรือการกำหนดโครงสร้างการกำหนดสามารถทำให้วิธีการส่งพารามิเตอร์ผ่านความยืดหยุ่นมากขึ้น
ความแตกต่างที่สำคัญระหว่างพารามิเตอร์ที่เหลือและ arguments
:
●พารามิเตอร์ที่เหลือมีเฉพาะพารามิเตอร์จริงที่ไม่มีพารามิเตอร์ที่เป็นทางการที่สอดคล้องกันในขณะที่วัตถุ arguments
มีพารามิเตอร์จริงทั้งหมดที่ส่งผ่านไปยังฟังก์ชัน
●พารามิเตอร์ที่เหลือเป็นอินสแตนซ์ Array
จริงในขณะที่ arguments
เป็นเพียงวัตถุคล้ายอาร์เรย์
ทั้งพารามิเตอร์ที่เหลือและไวยากรณ์การขยายใช้ตัวดำเนินการ ...
ในสถานการณ์ที่เกี่ยวข้องกับฟังก์ชั่น:
●ปรากฏขึ้นที่ส่วนท้ายของรายการพารามิเตอร์ฟังก์ชันและเป็นพารามิเตอร์ที่เหลือ
●เกิดขึ้นในการเรียกใช้ฟังก์ชันมันเป็นไวยากรณ์การขยายตัว
ข้างต้นเป็นบทความที่อธิบายรายละเอียดของพารามิเตอร์ในฟังก์ชัน JavaScript