Javaสคริปต์กำหนดและเรียกใช้ฟังก์ชันพร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

Javaฟังก์ชันสคริปต์เป็นกลุ่มของบล็อกโค้ดที่นำกลับมาใช้ซ้ำได้ ซึ่งจะทำงานก็ต่อเมื่อถูกเรียกเท่านั้น และบทช่วยสอนนี้จะแสดงวิธีการประกาศฟังก์ชันสคริปต์ การส่งอาร์กิวเมนต์เข้าไป และการส่งค่ากลับไปยังผู้เรียก

  • 🔘 ไวยากรณ์: ฟังก์ชันพื้นฐานทุกฟังก์ชันประกอบด้วยคำหลัก ฟังก์ชันชื่อ วงเล็บ และวงเล็บปีกกา
  • ☑️ โทรศัพท์: Code คำสั่งภายในฟังก์ชันจะทำงานก็ต่อเมื่อมีการเรียกใช้ชื่อฟังก์ชันโดยใช้เครื่องหมายวงเล็บเท่านั้น
  • ข้อโต้แย้ง: ค่าที่อยู่ภายในวงเล็บจะส่งผ่านข้อมูลจากผู้เรียกไปยังส่วนเนื้อหาของฟังก์ชัน
  • 🧪 เดินทางกลับ: คำสั่ง `return` จะส่งค่ากลับไปยังผู้เรียกใช้และหยุดการทำงาน ณ จุดนั้น
  • 🛠️ สายพันธุ์: การประกาศตัวแปร นิพจน์ ฟังก์ชันลูกศร IIFE และฟังก์ชันเรียกกลับ ล้วนเหมาะสมกับสถานการณ์ที่แตกต่างกัน
  • 📊 ขอบเขต: การประกาศฟังก์ชันจะถูกยกขึ้นไปด้านบน (hoisted) ในขณะที่นิพจน์ฟังก์ชันและฟังก์ชันลูกศรจะไม่ถูกยกขึ้นไปด้านบน

Javaสคริปต์กำหนดและเรียกใช้ฟังก์ชัน

ฟังก์ชั่นอยู่ในอะไร Javaสคริปต์?

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

ไม่มีส่วนใดภายในวงเล็บปีกกาทำงานด้วยตัวเอง เบราว์เซอร์จะจัดเก็บบล็อกนั้นไว้ภายใต้ชื่อที่คุณตั้ง และโค้ดจะทำงานก็ต่อเมื่อมีการเขียนชื่อนั้นโดยมีวงเล็บต่อท้าย เช่น myFunction()ดังนั้น หน้าที่ต่างๆ จึงอยู่ใจกลางของทุกสิ่ง Javaต้นฉบับ โปรแกรม ไม่ว่าสคริปต์จะยังใช้งานได้อยู่หรือไม่ ภายในหน้าเว็บหรือในไฟล์ภายนอก.

วิธีสร้างฟังก์ชั่นใน Javaต้นฉบับ

  1. ใช้คำสำคัญ ฟังก์ชัน ตามด้วยชื่อของฟังก์ชัน
  2. หลังชื่อฟังก์ชัน ให้เปิดและปิดวงเล็บ
  3. หลังวงเล็บ ให้เปิดและปิดเครื่องหมายปีกกา
  4. ภายในวงเล็บปีกกา ให้เขียนบรรทัดโค้ดของคุณ

ไวยากรณ์:

function functionname()
{

  lines of code to be executed

}

ตัวอย่างด้านล่างนี้กำหนด myFunction() จากนั้นเรียกใช้ฟังก์ชันนั้นในบรรทัดถัดไปทันที ข้อความจึงปรากฏขึ้นทันทีที่หน้าเว็บโหลดเสร็จ ลองทำดูเองได้เลย:

<html>
<head>
	<title>Functions!!!</title>
	<script type="text/javascript">
      function myFunction()
      {
      	document.write("This is a simple function.<br />");
      }
		myFunction();
	</script>
</head>
<body>
</body>
</html>

ฟังก์ชั่นที่มีอาร์กิวเมนต์

คุณสามารถสร้างฟังก์ชันที่มีอาร์กิวเมนต์ได้เช่นกัน โดยต้องระบุอาร์กิวเมนต์ไว้ในวงเล็บ

ไวยากรณ์:

function functionname(arg1, arg2)

{

  lines of code to be executed

}

Here countVowels() ฟังก์ชันนี้จะรับชื่อที่ผู้เข้าชมพิมพ์ลงในช่องป้อนข้อความ วนลูปตรวจสอบแต่ละตัวอักษร และรายงานจำนวนสระในชื่อนั้น ลองทำด้วยตัวเองดู:

<html>
<head>
	<script type="text/javascript">
		var count = 0;
		function countVowels(name)
		{
			for (var i=0;i<name.length;i++)
			{
              if(name[i] == "a" || name[i] == "e" || name[i] == "i" || name[i] == "o" || name[i] == "u")
              count = count + 1;
			}
		document.write("Hello " + name + "!!! Your name has " + count + " vowels.");
		}
   	 	var myName = prompt("Please enter your name");
    	countVowels(myName);
	</script>
</head>
<body>
</body>
</html>

Javaค่าการส่งคืนสคริปต์

คุณยังสามารถสร้างฟังก์ชัน JS ที่ส่งคืนค่าได้ ภายในฟังก์ชันคุณต้องใช้คีย์เวิร์ด กลับ ตามด้วยค่าที่จะส่งคืน

ไวยากรณ์:

function functionname(arg1, arg2)

{

  lines of code to be executed

  return val1;

}

ในตัวอย่างสุดท้ายนี้ returnSum() ส่งคืนค่ารวมกลับไปยังบรรทัดที่เรียกใช้ฟังก์ชันนั้น เพื่อให้สามารถนำผลลัพธ์ไปรวมไว้ในประโยคได้ แทนที่จะพิมพ์ออกมาภายในฟังก์ชัน ลองทำด้วยตัวเองดู:

<html>
<head>
	<script type="text/javascript">
		function returnSum(first, second)
        {
          var sum = first + second;
          return sum;
        }
      var firstNo = 78;
      var secondNo = 22;
      document.write(firstNo + " + " + secondNo + " = " + returnSum(firstNo,secondNo));
	</script>
</head>
<body>
</body>
</html>

ประเภทของฟังก์ชันใน Javaต้นฉบับ

ตัวอย่างทั้งสามข้างต้นใช้การประกาศฟังก์ชันแบบคลาสสิก แต่มีความทันสมัย Javaสคริปต์มีรูปแบบอื่นๆ อีกหลายรูปแบบ โดยหลักๆ แล้วแตกต่างกันตรงที่เครื่องยนต์จะยกพวกมันขึ้นหรือไม่ และแต่ละรูปแบบจัดการกับอย่างไร this คำสำคัญ.

ประเภทฟังก์ชัน ไวยากรณ์ทั่วไป เมื่อใช้งาน
การประกาศฟังก์ชัน ฟังก์ชัน greet() { } ตรรกะที่ตั้งชื่อและนำกลับมาใช้ใหม่ได้; ยกระดับขึ้นสู่ขอบเขตสูงสุด
การแสดงออกของฟังก์ชัน const greet = function () { }; การเก็บฟังก์ชันไว้ในตัวแปร โดยไม่ใช้วิธี Hoisted
ฟังก์ชันลูกศร (ES6) const greet = () => { }; ฟังก์ชันเรียกกลับแบบสั้น; สืบทอดคุณสมบัตินี้จากขอบเขตโดยรอบ
ฟังก์ชันนิรนาม setTimeout(function () { }, 100); ตรรกะเฉพาะกิจถูกส่งต่อไปยังฟังก์ชันอื่นโดยตรง
IIFE (การทำงาน () { })(); ทำงานทันทีและเก็บรักษาตัวแปรไว้เป็นความลับ
โทรกลับ รายการสำหรับแต่ละรายการ (แสดงรายการ); ฟังก์ชันที่ส่งต่อไปยังฟังก์ชันอื่นและเรียกใช้ในภายหลัง

หมายเหตุเกี่ยวกับตัวอย่างข้างต้น: ตัวอย่างทางประวัติศาสตร์ที่ใช้ var และ document.write()และทั้งสองแบบยังคงทำงานได้ในทุกเบราว์เซอร์ แนวทางปฏิบัติในปัจจุบันคือการประกาศตัวแปรด้วย let or const และพิมพ์ผลลัพธ์ผ่าน console.log() หรือโดยการตั้งค่า textContent บนองค์ประกอบหนึ่ง เนื่องจาก document.write() ลบหน้าเว็บที่โหลดเสร็จแล้วออกไป type="text/javascript" คุณสมบัตินี้เป็นตัวเลือกเสริมใน HTML5 เช่นกัน

พารามิเตอร์ฟังก์ชัน อาร์กิวเมนต์ และค่าเริ่มต้น

พารามิเตอร์คือชื่อตัวแทนที่ระบุไว้ในคำจำกัดความ ในขณะที่อาร์กิวเมนต์คือค่าจริงที่ป้อนเมื่อเรียกใช้ฟังก์ชัน countVowels(name) ข้างบน, name โดยที่ `parameter` และ `text` คือพารามิเตอร์ และ `argument` คือข้อความที่พิมพ์ลงในช่องป้อนข้อความ

function greet(user, greeting = "Hello")
{
  return greeting + ", " + user;
}

greet("Ann");
greet("Ann", "Welcome");
  • พารามิเตอร์ที่ไม่มีอาร์กิวเมนต์ที่ตรงกันจะกลายเป็น undefined เว้นแต่จะมีการระบุค่าเริ่มต้นไว้ เช่น greeting อยู่ที่นี่.
  • อาร์กิวเมนต์เพิ่มเติมจะถูกละเว้นโดยรายการพารามิเตอร์ แต่ยังคงสามารถเข้าถึงได้ผ่านทาง arguments วัตถุภายในฟังก์ชันที่ไม่ใช่ฟังก์ชันลูกศร
  • พารามิเตอร์ rest ที่เขียนไว้ดังนี้ ...values รวบรวมข้อโต้แย้งที่เหลือทั้งหมดเข้าไว้ด้วยกันอย่างแท้จริง แถว.

ขอบเขตการทำงานและการยกใน Javaต้นฉบับ

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

  • รอก: การประกาศฟังก์ชันจะถูกย้ายไปอยู่ด้านบนสุดของขอบเขตการทำงานก่อนที่สคริปต์จะเริ่มทำงาน เพื่อให้สามารถเรียกใช้ได้ในบรรทัดที่สูงกว่าคำนิยามของฟังก์ชันนั้น ส่วนนิพจน์ฟังก์ชันและฟังก์ชันลูกศรจะไม่ถูกย้ายไปอยู่ด้านบนสุด และจะเกิดข้อผิดพลาดหากถูกเรียกใช้ก่อนกำหนด
  • ขอบเขต: ตัวแปรที่ประกาศด้วย var ภายในฟังก์ชัน สิ่งต่างๆ จะปรากฏให้เห็นตลอดทั้งฟังก์ชันนั้น ในขณะที่ let และ const ตัวแปรเหล่านั้นจะจำกัดอยู่เฉพาะในบล็อกที่มันอยู่เท่านั้น ส่วนตัวแปรใดๆ ที่ประกาศอยู่นอกฟังก์ชันจะเป็นตัวแปรส่วนกลาง

ตัวนับสระแสดงให้เห็นสิ่งนี้ในทางปฏิบัติ count ตัวแปรถูกประกาศไว้นอกฟังก์ชัน ดังนั้นการเรียกใช้จึงไม่ถูกต้อง countVowels() การประกาศตัวแปรครั้งที่สองในหน้าเดียวกันจะยังคงบวกค่าเดิมต่อไปเรื่อยๆ แทนที่จะเริ่มต้นใหม่ที่ศูนย์ การย้ายการประกาศตัวแปรไปไว้ภายในฟังก์ชันจะทำให้ค่าถูกรีเซ็ตทุกครั้งที่มีการเรียกใช้

เหล่านี้ scoping กฎเหล่านี้ใช้ได้กับโค้ดฝั่งเซิร์ฟเวอร์เช่นกัน ซึ่งเป็นเหตุผลว่าทำไมจึงใช้หลักการเดียวกันเมื่อเขียนฟังก์ชัน Node.jsและเหตุใดพฤติกรรมของฟังก์ชันจึงปรากฏบ่อยครั้งใน Javaคำถามสัมภาษณ์ตามสคริปต์.

คำถามที่พบบ่อย

ฟังก์ชันยังคงทำงานอยู่ แต่จะส่งค่ากลับ undefinedการกำหนดค่าเรียกนั้นให้กับตัวแปรจะจัดเก็บค่าดังกล่าวไว้ undefinedซึ่งเป็นเหตุผลว่าทำไมตัวอย่างการหาผลรวมจึงใช้คำสั่ง return แทนการพิมพ์ผลรวมทั้งหมดภายในตัวฟังก์ชัน

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

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

Closure คือฟังก์ชันที่รวมตัวแปรภายนอกที่อ้างอิงถึงเมื่อสร้างขึ้นมา ฟังก์ชันภายในจะยังคงอ่านค่าตัวแปรเหล่านั้นต่อไปแม้ว่าฟังก์ชันภายนอกจะทำงานเสร็จแล้ว ซึ่งเป็นวิธีการสร้างตัวนับส่วนตัวและฟังก์ชันโรงงาน (factory function)

ใช่ และนั่นเรียกว่าการเรียกซ้ำ (recursion) ฟังก์ชันจะต้องมีกรณีพื้นฐาน (base case) ที่หยุดการเรียกซ้ำ มิฉะนั้นเบราว์เซอร์จะแสดงข้อผิดพลาดเกี่ยวกับช่วง (range error) เมื่อการเรียกซ้ำสิ้นสุดลง การเรียกซ้ำเหมาะสำหรับปัญหาที่เกี่ยวกับการเดินต้นไม้ (tree walking) และปัญหาประเภทแฟกทอเรียล (factorial)

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

แนบด้วยตัวรับฟังเหตุการณ์: เลือกปุ่ม จากนั้นเรียก addEventListener โดยระบุชื่อเหตุการณ์และการอ้างอิงฟังก์ชัน แอตทริบิวต์ onclick แบบอินไลน์แบบเก่าก็ใช้งานได้เช่นกัน แต่ปัจจุบันนิยมแยกมาร์กอัปออกจากพฤติกรรมมากกว่า

วงเล็บจะเรียกฟังก์ชันนั้นทันทีและส่งผลลัพธ์ออกมา การเขียนชื่อฟังก์ชันอย่างเดียวจะส่งผ่านตัวฟังก์ชันเอง ซึ่งเป็นสิ่งที่ฟังก์ชันเรียกกลับ (callback) ต้องการ การใส่วงเล็บโดยไม่ได้ตั้งใจภายใน setTimeout จะทำให้โค้ดทำงานทันทีแทนที่จะทำงานในภายหลัง

สรุปโพสต์นี้ด้วย: