เรียนรู้ความแตกต่างระหว่างการประกาศฟังก์ชันและนิพจน์ฟังก์ชันใน JavaScript
นี่คือนิพจน์ฟังก์ชัน:
// Function expression
let excuteMe = function () {
console.log('Function Expression')
}
นี่คือการประกาศฟังก์ชัน:
// Function declaration
function excuteMe() {
console.log('Function Declaration')
}
การแสดงออกของฟังก์ชันและการประกาศทำได้เหมือนกัน ในทั้งสองตัวอย่างข้างต้น คุณจะเรียกพวกเขาแบบนี้ executeMe()
จากนั้นพวกเขาก็รันโค้ดใดๆ ก็ตามที่อยู่ในบล็อคโค้ด {..}
.
แต่มีความแตกต่างไม่ใช่ในสิ่งที่พวกเขาทำ แต่ อย่างไร พวกเขากำลังดำเนินการ — หรือมากกว่า คำสั่ง พวกเขาจะอ่านและดำเนินการใน — และนี่เป็นสิ่งสำคัญ
ฟังก์ชันนี้จะทำงานได้ดี:
// Call to function declaration
executeMe()
// Function declaration
function excuteMe() {
console.log('Function Declaration')
}
อย่างไรก็ตาม ฟังก์ชันจะ ไม่ ทำงานได้ดี (จะทำให้เกิดข้อผิดพลาด):
// Call function
executeMe()
// Function expression
let excuteMe = function () {
console.log('Function Expression')
}
เพื่อให้เข้าใจว่าทำไมตัวอย่างแรก (การประกาศฟังก์ชัน) ถึงใช้งานได้ แต่ตัวอย่างที่สอง (นิพจน์ฟังก์ชัน) ไม่ทำงาน คุณต้องเรียนรู้สิ่งที่ การยก อยู่ใน JavaScript และจากนั้นก็จะเริ่มสมเหตุสมผล
รอก
ใน JavaScript โค้ดจะถูกรันจากบนลงล่าง โดยปกติ คุณสามารถใช้ตัวแปรได้หลังจากการประกาศในไฟล์สคริปต์ของคุณเท่านั้น (ตามลำดับ) อย่างไรก็ตาม การประกาศฟังก์ชัน ถูกยกขึ้นด้านบนโดยเว็บเบราว์เซอร์ ก่อนรันโค้ดใดๆ
รอกหมายความว่าตัวแปลรหัสของเบราว์เซอร์ เสมอ รู้เกี่ยวกับ (ได้อ่าน) การประกาศฟังก์ชันของคุณก่อนที่จะถูกเรียก (บอกให้ดำเนินการ)
เพื่อให้คุณสามารถเรียกและดำเนินการประกาศฟังก์ชันของคุณได้จาก ที่ใดก็ได้ ในไฟล์ JavaScript ของคุณ แม้กระทั่งก่อนที่การประกาศฟังก์ชันจะมีอยู่ในไฟล์สคริปต์ของคุณก็ตาม ทำให้การประกาศฟังก์ชันไม่ซ้ำกัน
การประกาศฟังก์ชัน
ก่อนที่จะสามารถเรียกใช้โค้ดใดๆ ได้ เบราว์เซอร์ของคุณจะโหลด (อ่าน) ไฟล์สคริปต์ JS ทั้งหมดของคุณ และเนื่องจากการประกาศฟังก์ชันจะถูกย้ายไปที่ด้านบนสุด (ยกขึ้น) ของ ลำดับการดำเนินการ รหัสของคุณถูกรันโดยล่ามตามลำดับนี้:
// 1. Function declaration
function excuteMe() {
console.log('Function Declaration')
}
// 2. Call to function declaration
executeMe()
แม้ว่าโค้ดของคุณจะถูกเขียนในไฟล์สคริปต์ของคุณในลำดับที่ตรงกันข้าม:
// Call to function declaration
executeMe()
// Function declaration
function excuteMe() {
console.log('Function Declaration')
}
นั่นเป็นเหตุผลที่ไม่สำคัญว่าคุณจะทำการเรียกใช้การประกาศฟังก์ชันของคุณก่อนหรือหลังที่กำหนดไว้ในไฟล์สคริปต์ของคุณ ทั้งสองวิธีใช้งานได้เพราะ JavaScript โหลดฟังก์ชัน การประกาศ . เสมอ ก่อนเรียกใช้ฟังก์ชัน โทร ต่อการประกาศฟังก์ชันเหล่านั้น
ฟังก์ชั่นนิพจน์ไม่ยก
นิพจน์ของฟังก์ชันไม่ได้ถูกยกขึ้น (ไม่ได้อ่านก่อน) นิพจน์ของฟังก์ชันจะอ่านได้ก็ต่อเมื่อล่ามไปถึงบรรทัดโค้ดดังกล่าวในไฟล์สคริปต์ของคุณ ดังนั้นหากนิพจน์ฟังก์ชันของคุณมีอยู่จริง หลัง การเรียกใช้ฟังก์ชันของคุณ (ตามลำดับ) จากนั้นล่าม JavaScript ที่ทำงานในเบราว์เซอร์ของคุณไม่สามารถดำเนินการได้
วิธีนี้ใช้ไม่ได้ผล:
// Call function expression
executeMe()
// Function expression
let excuteMe = function () {
console.log('Function Expression')
}
รหัสด้านบนจะทำให้คุณมีข้อผิดพลาดเนื่องจากคุณกำลังพยายามเรียกใช้ฟังก์ชัน (executeMe()
) ก่อนที่ตัวแปลโค้ดของเบราว์เซอร์จะทราบ (ได้อ่าน) เกี่ยวกับการมีอยู่ของนิพจน์ฟังก์ชันของคุณ
สลับลำดับรหัสและใช้งานได้:
// Function expression
let excuteMe = function () {
console.log('Function Expression')
}
// Call function expression
executeMe()
รหัสด้านบนใช้งานได้เนื่องจากลำดับรหัส เบราว์เซอร์ของคุณจะอ่านบรรทัดแรก (บนลงล่าง) ด้วยตัวแปร let executeMe
ที่มีนิพจน์ฟังก์ชันของคุณ - จากนั้นระบบจะขอให้ดำเนินการในภายหลังด้วย executeMe()
.
คุณควรใช้อันไหน
สิ่งที่สำคัญไม่ใช่ว่าคุณใช้การประกาศฟังก์ชันหรือนิพจน์ฟังก์ชัน จะไม่ทำให้หรือทำลายอาชีพของคุณ ความสม่ำเสมอมีความสำคัญมากกว่า เลือกสไตล์และยึดติดกับมัน อย่างน้อยก็ภายในโปรเจ็กต์เดียวกัน
ที่สำคัญยิ่งกว่านั้น หากคุณเข้าร่วมทีมที่ใช้นิพจน์ฟังก์ชัน คุณควรปฏิบัติตามสูตรของพวกเขาเพื่อให้ codebase มีความสอดคล้องกัน ไม่ว่าคุณจะชอบความชอบส่วนตัวของคุณอย่างไร
กรณีหนึ่งที่ดีในการใช้นิพจน์ฟังก์ชันคือ การบังคับให้คุณใช้โครงสร้างโค้ดที่เข้มงวดขึ้น ซึ่งทำให้โค้ดของคุณสามารถคาดเดาได้มากขึ้น การประกาศฟังก์ชันเป็นสิ่งที่ให้อภัยเพราะคุณสามารถเรียกได้จากทุกที่ในสคริปต์ และทำให้ สามารถ นำไปสู่โครงสร้างโค้ดที่ไม่สอดคล้องกัน โดยเฉพาะอย่างยิ่งหากนักพัฒนาหลายคนกำลังทำงานในโครงการเดียวกัน
กรณีที่ดี (เป็นที่ถกเถียงกัน) สำหรับการใช้การประกาศฟังก์ชันคือถ้าคุณมีฟังก์ชันบางอย่างที่เรียกใช้ฟังก์ชันอื่น แต่คุณสับสนเกี่ยวกับและด้วยเหตุผลบางอย่างที่ไม่สามารถทำให้นิพจน์ฟังก์ชันของคุณทำงานเนื่องจากความสับสนในคำสั่งบางอย่าง