JavaScript Academy · บทเรียน

this แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร

ดูว่า this แบบไดนามิกขึ้นอยู่กับจุดเรียกใช้อย่างไร และฟังก์ชันลูกศรจับ this แบบเลกซิคัลอย่างไร พร้อมใช้ตัวอย่างที่สั้นและชัดเจน

บทเรียน 1 จาก 38 ขั้นตอน

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

ภาพรวม

เป้าหมาย: ทำความเข้าใจว่า this ชี้ไปที่ใดในแต่ละกรณี

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

ตัวอย่าง 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 แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร — ภาพประกอบ 2

ฟังก์ชันลูกศร = 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 แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร — ภาพประกอบ 3

ฟังก์ชันเรียกกลับ: คง 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();
this แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร — ภาพประกอบ 4

วิธีแก้แบบง่ายสำหรับการดึงออก

หากดึงเมธอดออก ให้ห่อด้วย 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());
this แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร — ภาพประกอบ 5

แนวปฏิบัติที่ดี

เคล็ดลับ:

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

แบบทดสอบ this ของฟังก์ชันลูกศร

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

this แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร — ภาพประกอบ 7

สรุปทบทวน

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

this แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร — ภาพประกอบ 8
เริ่มต้นได้ฟรี

เรียนรู้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. this แบบเลกซิคัลกับแบบไดนามิก ทบทวนฟังก์ชันลูกศร
  2. ข้อควรระวังในการแยกเมธอดและการประยุกต์ฟังก์ชันบางส่วน
  3. ทางเลือกเชิงฟังก์ชัน — ส่งบริบท คลอเชอร์ และตัวช่วยขนาดเล็ก
← กลับไปที่ JavaScript Academy