นิยามฟังก์ชั่นและการโทร
การกำหนดฟังก์ชั่น ใน JavaScript วิธีการกำหนดฟังก์ชั่นมีดังนี้:
ฟังก์ชัน abs (x) {ถ้า (x> = 0) {return x;} else {return -x;}}ฟังก์ชั่น ABS () ข้างต้นหมายถึงดังนี้:
ฟังก์ชั่นบ่งชี้ว่านี่เป็นคำจำกัดความของฟังก์ชัน
ABS คือชื่อของฟังก์ชั่น
(x) แสดงรายการพารามิเตอร์ของฟังก์ชันในวงเล็บคั่นด้วยพารามิเตอร์หลายตัว
รหัสระหว่าง {... } เป็นตัวฟังก์ชั่นซึ่งสามารถมีหลายข้อความหรือแม้กระทั่งไม่มีคำสั่งใด ๆ
หมายเหตุ: เมื่อมีการดำเนินการคำสั่งภายในฟังก์ชั่นเมื่อมีการดำเนินการเพื่อส่งคืนฟังก์ชั่นจะถูกดำเนินการและผลลัพธ์จะถูกส่งคืน ดังนั้นการกำหนดภายในและลูปสามารถดำเนินการได้อย่างซับซ้อนมาก
หากไม่มีคำสั่ง Return ผลลัพธ์จะถูกส่งคืนหลังจากการดำเนินการฟังก์ชั่น แต่ผลลัพธ์จะไม่ได้กำหนด
เนื่องจากฟังก์ชั่นของ JavaScript ก็เป็นวัตถุฟังก์ชั่น ABS () ที่กำหนดไว้ข้างต้นเป็นวัตถุฟังก์ชันและชื่อฟังก์ชัน ABS สามารถถือได้ว่าเป็นตัวแปรที่ชี้ไปที่ฟังก์ชัน
var abs = function (x) {ถ้า (x> = 0) {return x;} else {return -x;}}ด้วยวิธีนี้ฟังก์ชั่น (x) {... } เป็นฟังก์ชันที่ไม่ระบุชื่อที่ไม่มีชื่อฟังก์ชั่น อย่างไรก็ตามฟังก์ชั่นที่ไม่ระบุชื่อนี้ถูกกำหนดให้กับตัวแปร ABS ดังนั้นฟังก์ชั่นสามารถเรียกผ่าน ABS ตัวแปร
คำจำกัดความทั้งสองนั้นเทียบเท่ากันอย่างสมบูรณ์ โปรดทราบว่าวิธีที่สองจำเป็นต้องเพิ่มหนึ่งในตอนท้ายของฟังก์ชั่นร่างกายตามไวยากรณ์ที่สมบูรณ์ซึ่งระบุว่าคำสั่งการกำหนดจะสิ้นสุดลง
เมื่อเรียกใช้ฟังก์ชันเพียงแค่ส่งผ่านพารามิเตอร์ตามลำดับ:
abs (10); // return 10
abs (-9); // กลับไปที่ 9
เนื่องจาก JavaScript อนุญาตให้ส่งพารามิเตอร์ใด ๆ โดยไม่ได้รับผลกระทบจึงไม่มีปัญหาว่าจะมีพารามิเตอร์มากกว่าพารามิเตอร์ที่กำหนดไว้มากกว่าพารามิเตอร์ที่กำหนดแม้ว่าพารามิเตอร์เหล่านี้จะไม่จำเป็นต้องใช้ภายในฟังก์ชัน
abs (10, 'blablabla'); // return 10
abs (-9, 'haha', 'hehe', null) // กลับไปที่ 9
ไม่มีปัญหากับพารามิเตอร์น้อยกว่าที่กำหนดไว้
abs (); คืนน่าน
ในเวลานี้พารามิเตอร์ X ของฟังก์ชั่น ABS (X) จะได้รับที่ไม่ได้กำหนดและผลการคำนวณคือ NAN
ฟังก์ชั่น abs (x) {ถ้า (typeof x! == 'number') {โยน 'ไม่ใช่ตัวเลข':} ถ้า (x> = 0) {return x;} else {return -x;}}ข้อโต้แย้ง
JavaScript ยังมีอาร์กิวเมนต์คำหลักฟรีซึ่งใช้งานได้ภายในฟังก์ชั่นเท่านั้นและชี้ไปที่พารามิเตอร์ทั้งหมดที่ส่งผ่านโดยผู้โทรของฟังก์ชันปัจจุบัน
ฟังก์ชั่น foo (x) {แจ้งเตือน (x); // 10for (var i = 0; i <arguments.length; ++) {แจ้งเตือน (อาร์กิวเมนต์ [i]); // 10,20,30}} foo (10.20,30)ด้วยอาร์กิวเมนต์คุณสามารถรับพารามิเตอร์ทั้งหมดที่ส่งผ่านโดยผู้โทร กล่าวคือแม้ว่าฟังก์ชั่นจะไม่กำหนดพารามิเตอร์ใด ๆ ค่าของพารามิเตอร์ยังสามารถรับได้:
ฟังก์ชัน abs () {ถ้า (arguments.length === 0) {return 0;} var x = อาร์กิวเมนต์ [0] return x> = 0? x: -x;} abs (); // 0abs (10); // 10abs (-9) // 9ในความเป็นจริงอาร์กิวเมนต์มักใช้เพื่อกำหนดจำนวนพารามิเตอร์ที่เข้ามา คุณอาจเห็นการเขียนนี้:
// foo (a [, b], c)
// ยอมรับพารามิเตอร์ 2 ~ 3, B เป็นพารามิเตอร์เสริม หากมีการป้อนและออกจากพารามิเตอร์เพียงสองตัว B จะเป็นค่าเริ่มต้นโดยค่าเริ่มต้น
ฟังก์ชั่น foo (a, b, c) {if (arguments.length === 2) {// พารามิเตอร์จริงที่ได้รับคือ a และ bc คือ undefinedC = b; b = null; // b กลายเป็นค่าเริ่มต้นในการเปลี่ยนพารามิเตอร์กลาง B เป็นพารามิเตอร์ "ตัวเลือก" คุณสามารถตัดสินได้ผ่านอาร์กิวเมนต์เท่านั้นจากนั้นปรับค่าพารามิเตอร์และกำหนดค่า
พารามิเตอร์ที่เหลือ
เนื่องจากฟังก์ชั่น JavaScript อนุญาตให้รับพารามิเตอร์ใด ๆ เราจึงต้องใช้อาร์กิวเมนต์เพื่อรับพารามิเตอร์ทั้งหมดเมื่อพบปัญหา:
ฟังก์ชั่น foo (a, b) {var i, rest = []; if (arguments.length> 2) {สำหรับ (i = 2; i <arguments.length; i ++) {rest.push (อาร์กิวเมนต์ [i]);}} console.log ('a =' + a); console.log ('b =' + b);เพื่อให้ได้พารามิเตอร์อื่นนอกเหนือจากพารามิเตอร์ที่กำหนด A และ B เราต้องใช้อาร์กิวเมนต์และลูปเริ่มต้นจากดัชนี 2 เพื่อยกเว้นพารามิเตอร์สองตัวแรก วิธีการเขียนนี้น่าอึดอัดใจเพียงเพื่อให้ได้พารามิเตอร์ที่เหลือพิเศษ มีวิธีที่ดีกว่านี้ไหม
มาตรฐาน ES6 แนะนำพารามิเตอร์ REST และฟังก์ชั่นด้านบนสามารถเขียนใหม่เป็น:
ฟังก์ชั่น foo (a, b, ... พักผ่อน) {console.log ('a =' + a); console.log ('b =' + b); console.log (พักผ่อน);} foo (1,2,3,4,5); // result // a = 1 // 2 // 2 //พารามิเตอร์ที่เหลือสามารถเขียนได้ในตอนท้ายและทำเครื่องหมายด้วย ... จากผลการรัน จากผลการดำเนินการเราจะเห็นได้ว่าพารามิเตอร์ที่ผ่านจะถูกผูกไว้กับ A, B และพารามิเตอร์พิเศษจะถูกส่งไปยังส่วนที่เหลือตัวแปรในอาร์เรย์ดังนั้น
เราได้รับพารามิเตอร์ทั้งหมดโดยไม่ต้องมีข้อโต้แย้ง
หากพารามิเตอร์ที่ผ่านไม่ได้เต็มไปด้วยพารามิเตอร์ที่กำหนดไว้ปกติมันไม่สำคัญพารามิเตอร์ REST จะได้รับอาร์เรย์ที่ว่างเปล่า (โปรดทราบว่าไม่ได้กำหนด)
คำสั่งคืน
เราได้กล่าวถึงก่อนหน้านี้ว่าเครื่องยนต์ JavaScript มีกลไกในการเพิ่มเซมิโคลอนโดยอัตโนมัติในตอนท้ายของบรรทัดซึ่งอาจทำให้คุณตกอยู่ในหลุมขนาดใหญ่ในคำสั่ง Return:
function foo () {return {name: 'foo'};} foo (); // {ชื่อ: 'foo'}บันทึก:
function foo () {return: // semicolon ถูกเพิ่มโดยอัตโนมัติซึ่งเทียบเท่ากับการส่งคืน {name: 'foo'}; // บรรทัดคำสั่งนี้ไม่สามารถดำเนินการได้อีกต่อไป -ดังนั้นวิธีที่ถูกต้องในการเขียนหลายบรรทัดคือ
function foo () {return {// semicolon จะไม่ถูกเพิ่มโดยอัตโนมัติที่นี่เพราะหมายความว่าคำสั่งยังไม่สิ้นสุด ชื่อ: 'foo'}}ขอบเขตตัวแปร
ใน JavaScript สิ่งที่ประกาศด้วย VAR นั้นถูกกำหนดขอบเขตจริง
หากมีการประกาศตัวแปรภายในร่างกายฟังก์ชั่นขอบเขตของตัวแปรคือร่างกายฟังก์ชั่นทั้งหมดและตัวแปรไม่ควรอ้างอิงนอกร่างกายฟังก์ชั่น
'ใช้อย่างเข้มงวด': function foo () {var x = 1; x = x +1;} x = x +2; // refrenceError ไม่สามารถอ้างถึงตัวแปร x นอกฟังก์ชั่นหากฟังก์ชั่นที่แตกต่างกันสองฟังก์ชั่นแต่ละตัวจะประกาศตัวแปรเดียวกันตัวแปรจะทำงานเฉพาะภายในร่างกายของฟังก์ชั่นที่เกี่ยวข้อง กล่าวอีกนัยหนึ่งตัวแปรที่มีชื่อเดียวกันภายในฟังก์ชั่นที่แตกต่างกันนั้นเป็นอิสระจากกันและไม่ส่งผลกระทบต่อกันและกัน:
'ใช้ struct': function foo () {var x = 1; x = x +1;} function bar () {var x = 'a'; x = x + 'b';}เนื่องจากฟังก์ชั่น JavaScript สามารถซ้อนกันได้ฟังก์ชั่นภายในสามารถเข้าถึงตัวแปรที่กำหนดโดยฟังก์ชั่นภายนอกและวิธีอื่น ๆ ก็ไม่ใช่:
'ใช้อย่างเข้มงวด'; ฟังก์ชั่น foo () {var x = 1; แถบฟังก์ชัน () {var x = 1; แถบฟังก์ชัน () {var y = x +1; // bar สามารถเข้าถึงตัวแปร x ของ foo z = y + 1; // ReferenceRoror! ฟูไม่สามารถเข้าถึงตัวแปร y ของบาร์ได้! -จะเกิดอะไรขึ้นถ้าชื่อตัวแปรของฟังก์ชั่นภายในและภายนอกเพิ่มขึ้นเป็นสองเท่า?
'ใช้อย่างเข้มงวด': function foo () {var x = 1; function bar () {var x = 'a'; การแจ้งเตือน ('x in bar () =' + x); // 'a'} Alert ('x ใน foo () =' + x) // 1bar ();}การปรับปรุงตัวแปร
นิยามฟังก์ชั่นของ JavaScript มีคุณสมบัติซึ่งจะสแกนคำสั่ง Body Function ทั้งหมดและ "อัพเกรด" ตัวแปรทั้งหมดที่ประกาศไว้ที่ด้านบนของฟังก์ชั่น:
'ใช้อย่างเข้มงวด'; function foo () {var x = 'hello,'+y; Alert (x); var y = 'bob';} foo ();สำหรับฟังก์ชั่น Foo () ด้านบนรหัสที่เห็นโดยเอ็นจิ้น JavaScript นั้นเทียบเท่ากับ:
function foo () {var y; // เพิ่ม var x ของตัวแปร y = 'hello' + y; Alert (x); y = 'bob';}เนื่องจาก "ลักษณะ" แปลก ๆ ของ JavaScript เมื่อเรากำหนดตัวแปรภายในฟังก์ชั่นโปรดปฏิบัติตามกฎอย่างเคร่งครัด "เพื่อประกาศตัวแปรทั้งหมดก่อนภายในฟังก์ชั่น" วิธีที่พบบ่อยที่สุดคือการใช้ VAR เพื่อประกาศตัวแปรทั้งหมดที่ใช้ภายในในฟังก์ชัน:
function foo () {var x = 1, // x เริ่มต้นเป็น 1y = x +1, // y เริ่มต้นเป็น 2z, i; // z และฉันไม่ได้กำหนด // ข้อความอื่น ๆ สำหรับ (i = 0; i <100; i ++) {... }}ขอบเขตระดับโลก
ตัวแปรที่ไม่ได้กำหนดไว้ในฟังก์ชั่นใด ๆ มีขอบเขตทั่วโลก ในความเป็นจริง JavaScript มีตัวแปรที่กำหนดขอบเขตทั่วโลกโดยค่าเริ่มต้นซึ่งถูกผูกไว้กับคุณสมบัติของหน้าต่าง
'ใช้อย่างเข้มงวด'; var source = 'เรียนรู้ JavaScript'; แจ้งเตือน (หลักสูตร); // 'เรียนรู้ JavaScript'; Alert (window.course); // 'เรียนรู้ JavaScript'
เนมสเปซ
ตัวแปรทั่วโลกจะถูกผูกไว้กับหน้าต่าง ไฟล์ JavaScript ที่แตกต่างกันใช้ตัวแปรส่วนกลางเดียวกันหรือมีฟังก์ชั่นระดับบนสุดเดียวกันซึ่งจะทำให้เกิด
การตั้งชื่อความขัดแย้งและตรวจจับได้ยาก
วิธีหนึ่งในการลดความขัดแย้งคือการผูกตัวแปรและฟังก์ชั่นทั้งหมดของคุณเข้ากับตัวแปรทั่วโลก
// ตัวแปร quju ตัวเดียว myAppVar myApp = {}; // ตัวแปรอื่น ๆ : myApp.name = 'myApp'; myApp.version = 1.0; // ฟังก์ชั่นอื่น ๆ myApp.foo = function () {return 'foo';};การวางรหัสทั้งหมดของคุณลงในเนมสเปซที่ไม่ซ้ำกัน MyApp จะลดความเป็นไปได้ของความขัดแย้งตัวแปรทั่วโลกอย่างมาก
ขอบเขตท้องถิ่น
เนื่องจากขอบเขตตัวแปรของ JavaScript นั้นอยู่ในฟังก์ชั่นเราจึงไม่สามารถกำหนดตัวแปรที่ไม่สามารถกำหนดได้ในบล็อกคำสั่งเช่นสำหรับลูป
function foo () {สำหรับ (var i = 0; i <100; i ++) {//} i+= 100; // ตัวแปรยังสามารถอ้างอิงได้;}ในการแก้ปัญหาขอบเขตระดับบล็อก ES6 ได้แนะนำคำหลักใหม่ ๆ และแทนที่จะเป็น VAR คุณสามารถประกาศตัวแปรขอบเขตระดับบล็อก:
function foo () {var sum = 0; สำหรับ (ให้ i = 0; i <100; i ++) {sum += i;} i += 1;}คงที่
เนื่องจาก VAR และให้ประกาศตัวแปรหากคุณต้องการประกาศค่าคงที่มันจะไม่ทำงานก่อน ES6 เรามักจะใช้ตัวแปรทุนทั้งหมดเพื่อระบุว่านี่เป็นค่าคงที่
อย่าปรับเปลี่ยนค่า
var pi = 3.14;
มาตรฐาน ES6 แนะนำคำหลักใหม่ const เพื่อกำหนดค่าคงที่ทั้ง const และให้มีขอบเขตระดับบล็อก;
const pi = 3.14;
pi = 3; // เบราว์เซอร์บางตัวไม่รายงานข้อผิดพลาด แต่ไม่มีผล
PI; // 3.14
การวิเคราะห์ฟังก์ชั่นพื้นฐาน JavaScript ด้านบนของตัวแปรและขอบเขตคือเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น