Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

ขอบเขตทำงานอย่างไรใน JavaScript

เรียนรู้เกี่ยวกับวิธีการทำงานของ Scope ใน JavaScript และความแตกต่างระหว่าง Global Scope, Local Scope และ Lexical Scope

ขอบเขต หมายถึงบริบทที่ฟังก์ชันหรือตัวแปรสามารถเข้าถึงได้ JavaScript มีขอบเขตสามประเภท ได้แก่ ขอบเขตสากล ขอบเขตภายใน ขอบเขตคำศัพท์:

  • A ตัวแปรส่วนกลาง เป็นตัวแปรที่ประกาศนอกบล็อคโค้ด
  • A ตัวแปรท้องถิ่น เป็นตัวแปรที่ประกาศภายในบล็อคโค้ด

นานาน่ารู้: ฟังก์ชั่นสามารถเข้าถึงตัวแปรและฟังก์ชั่นอื่น ๆ ที่ตั้งค่า ภายนอก ตัวเอง — แต่ไม่ใช่ตัวแปรที่ตั้งค่า ภายใน ฟังก์ชันอื่นๆ

มันจะสมเหตุสมผลในไม่กี่นาที

ขอบเขตทั่วโลก

ตัวแปรหรือฟังก์ชันใดๆ ในขอบเขตส่วนกลางสามารถเข้าถึงได้ภายในฟังก์ชันอื่นๆ:

// Global scope
let dogBreed = "Labrador"

let getDogBreed = function() {
  // dogBreed is accessible because it’s in the global scope
  console.log(dogBreed)
  // "Labrador"
}

// Run function
getDogBreed()

ซึ่งรวมถึง ฟังก์ชันภายในฟังก์ชัน:

// Global scope
let dogBreed = "Labrador"

let getDogBreed = function() {
  // function inside function
  let getDogBreedFromGlobalScope = function() {
    // accesses dogBreed from the global scope
    console.log(dogBreed)
    // "Labrador"
  }
  // Run function
  getDogBreedFromGlobalScope()
}

// Run function
getDogBreed()

ขอบเขตท้องถิ่น

ตัวแปรหรือฟังก์ชันที่มีขอบเขตเฉพาะที่สามารถเข้าถึงได้จากภายในบริบทของตัวเองเท่านั้น (ขอบเขต):

let getDogBreed = function() {
  // local variable scope
  let dogBreed = "Labrador"
  // We can access the dogBreed variable because it’s local
  console.log(dogBreed)
  // "Labrador
}

ตัวแปร dogBreed มีขอบเขตท้องถิ่นและสามารถเข้าถึงได้จากภายในขอบเขตเท่านั้น (ภายในวงเล็บปีกกา{ .. } )

นี่คือรหัสเดียวกันกับด้านบน แต่คราวนี้เราย้าย console.log(dogBreed) นอกขอบเขตท้องถิ่น ดังนั้นตอนนี้จึงอยู่ในขอบเขตส่วนกลาง:

let getDogBreed = function() {
  // local variable scope
  let dogBreed = "Labrador"
}

// Try to access a locally scoped variable
console.log(dogBreed)
// Uncaught ReferenceError: dogBreed is not defined

คุณได้รับข้อผิดพลาดในการอ้างอิงที่ระบุว่า “dog breed is not defined” เนื่องจากคุณกำลังพยายามล็อกเอาต์ตัวแปรที่กำหนดขอบเขตในเครื่องจากขอบเขตส่วนกลาง

ขอบเขตคำศัพท์

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

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

// Global scope
let animals = function() {
  // Lexical scope
  let dogBreed = "Labrador"
  // Nested function
  let getAnimals = function() {
    // We can access dogBreed because it's in the lexical scope
    console.log(dogBreed)
    // "Labrador"

    // Here’s a locally scoped variable
    let catBreed = "Persian"
    console.log(catBreed)
    // "Persian"
  }
  // Run function
  getAnimals()

  // This works because the dogBreed variable is in the lexical scope
  console.log(dogBreed)
  // "Labrador"

  // This won’t work, because catBreed is not in the lexical scope, it’s local to the getAnimals() function
  console.log(catBreed)
  // Uncaught ReferenceError: catBreed is not defined
}

animals()