this แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร
ดูว่า this แบบไดนามิกขึ้นอยู่กับจุดเรียกใช้อย่างไร และฟังก์ชันลูกศรจับ this แบบเลกซิคัลอย่างไร พร้อมใช้ตัวอย่างที่สั้นและชัดเจน
this แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร เป็นบทเรียน JavaScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน JavaScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
ภาพรวม
เป้าหมาย: ทำความเข้าใจว่า this ชี้ไปที่ใดในแต่ละกรณี
- this แบบไดนามิก: กำหนดโดยจุดที่เรียก
- this ของฟังก์ชันลูกศร: จับค่าตามขอบเขตศัพท์
- ข้อผิดพลาดที่พบบ่อย: การดึงเมธอดออกทำให้สูญเสีย this
- ใช้ฟังก์ชันลูกศรเพื่อคง this ไว้ภายในฟังก์ชันเรียกกลับ

ตัวอย่าง this แบบไดนามิก
this แบบไดนามิก: การเรียกเป็น obj.method() จะกำหนดให้ this = obj แต่การดึงฟังก์ชันออกจะทำให้อ็อบเจ็กต์หายไป
// Dynamic this depends on HOW we call the function
const person = {
name: "Ayla",
say: function () {
return "Hi " + this.name;
}
};
console.log("method call:", person.say()); // "Hi Ayla"
// Extract then call: this is lost
const talk = person.say;
console.log("extracted call:", talk()); // likely "Hi undefined" in strict mode -> this is undefined

ฟังก์ชันลูกศร = this ตามขอบเขตศัพท์
arrow จะรับค่า this จากขอบเขตของฟังก์ชันหรืออ็อบเจ็กต์โดยรอบเมื่อถูกสร้าง และจะไม่เปลี่ยนแปลงขณะถูกเรียก
// Arrow functions capture this from where they are created
const box = {
label: "blue",
showLater: function () {
// Arrow keeps this === box
const fn = () => "box:" + this.label;
return fn();
}
};
console.log("arrow captured this:", box.showLater()); // "box:blue"

ฟังก์ชันเรียกกลับ: คง this ด้วยฟังก์ชันลูกศร
ในฟังก์ชันเรียกกลับ ฟังก์ชันปกติ มักสูญเสีย this แต่ arrow จะคงค่า this จากขอบเขตภายนอกไว้
// Using a normal function in a callback can lose this
const widget = {
id: 7,
normal: function () {
setTimeout(function () {
// here this is not widget in many environments
console.log("normal cb this.id:", this && this.id);
}, 0);
},
arrow: function () {
setTimeout(() => {
// arrow keeps lexical this from arrow()
console.log("arrow cb this.id:", this.id);
}, 0);
}
};
widget.normal();
widget.arrow();

วิธีแก้แบบง่ายสำหรับการดึงออก
หากดึงเมธอดออก ให้ห่อด้วย arrow ขนาดเล็กที่เก็บอ็อบเจ็กต์ไว้ในคลอเชอร์ หรือใช้ bind (บทเรียนถัดไป) สำหรับผู้เริ่มต้น ควรทำให้เรียบง่าย
// If you must extract, wrap with an arrow capturing the object
const account = {
owner: "Mila",
label: function () { return "Owner:" + this.owner; }
};
// Lost this:
const lost = account.label;
console.log("lost:", lost()); // "Owner:undefined" (this missing)
// Fixed: create an arrow that closes over account
const safe = () => account.label();
console.log("fixed via arrow wrapper:", safe());

แนวปฏิบัติที่ดี
เคล็ดลับ:
- เมธอด: เรียกด้วย obj.method() เพื่อให้ this เป็นอ็อบเจ็กต์
- ฟังก์ชันเรียกกลับ: ควรใช้ arrow เพื่อคง this ตามขอบเขตศัพท์
- เมธอดที่ถูกดึงออกจะสูญเสีย this ให้ห่อด้วย arrow หรือใช้ bind

แบบทดสอบ this ของฟังก์ชันลูกศร
ตรวจสอบอย่างรวดเร็ว: การทำงานของ this ในฟังก์ชันลูกศร

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

เรียนรู้ JavaScript ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 59
- บทเรียน
- 200
คำถามที่พบบ่อย
บทเรียน “this แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “this แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส JavaScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “this แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร”
ดูว่า this แบบไดนามิกขึ้นอยู่กับจุดเรียกใช้อย่างไร และฟังก์ชันลูกศรจับ this แบบเลกซิคัลอย่างไร พร้อมใช้ตัวอย่างที่สั้นและชัดเจน คุณปฏิบัติ JavaScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน JavaScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน JavaScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน
บทเรียน “this แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน JavaScript Academy นี้ได้ไหม
ได้ บทเรียน JavaScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- this แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร
- ข้อควรระวังในการแยกเมธอดและการประยุกต์ฟังก์ชันบางส่วน
- ทางเลือกเชิงฟังก์ชัน — ส่งบริบท คลอเชอร์ และตัวช่วยขนาดเล็ก