สำหรับขอบเขตของตัวแปรภาษาต่าง ๆ เช่น C, Java ใช้วิธีการ "บล็อกขอบเขต" ในทางตรงกันข้าม JavaScript ใช้วิธี "ขอบเขตฟังก์ชัน" - ขอบเขตของตัวแปรจะถูกกำหนดโดยฟังก์ชั่นที่อยู่และไม่มีอะไรเกี่ยวข้องกับบล็อกตรรกะเช่นถ้าและสำหรับ ตัวอย่างเช่นตัวอย่างต่อไปนี้แสดงพฤติกรรมใน JavaScript ที่แตกต่างจากภาษาเช่น C และ Java:
การคัดลอกรหัสมีดังนี้:
การทำงาน(){
var s = 42; // s สามารถมองเห็นได้ตลอดฟังก์ชั่น
ถ้า (s> 3) {
var x = "test"; // x สามารถมองเห็นได้ตลอดฟังก์ชั่น
สำหรับ (var i = 0; i <10; i ++) {
console.log (i);
-
console.log (i); // ฉันสามารถมองเห็นได้ตลอดฟังก์ชั่น
-
console.log (i);
console.log (x);
-
ในภาษา "Block Scope" เช่น C และ Java หลังจากบล็อกเชิงตรรกะเช่นคำสั่งและคำสั่งเสร็จสมบูรณ์ตัวแปรที่กำหนดไว้ในบล็อกตรรกะเหล่านี้จะถูกทำลาย จาวาสคริปต์แตกต่างกัน ตราบใดที่ตัวแปรถูกกำหนดภายในฟังก์ชั่นรหัสทั้งหมดในฟังก์ชันทั้งหมดสามารถเข้าถึงตัวแปรได้แม้ว่ารหัสจะอยู่ก่อนนิยามตัวแปร:
การคัดลอกรหัสมีดังนี้:
การทำงาน(){
console.log (a); // undefined
var a = "ทดสอบ";
console.log (a); // ทดสอบ
-
ในตัวอย่างข้างต้นหากไม่ได้กำหนดไว้ในฟังก์ชั่นคอนโซลล็อก (a) จะโยน referenceError เมื่อ A ถูกกำหนดไว้ในฟังก์ชั่นแม้ว่าคำจำกัดความนี้จะเป็นหลังจากคำสั่งการเรียกตัวแปรการเรียกไปยัง A คือการดำเนินการทางกฎหมาย (หากคำจำกัดความของตัวแปรเกิดขึ้นหลังจากคำสั่งการโทรค่าของตัวแปรในคำสั่งการโทรจะไม่ได้กำหนด) ในความเป็นจริงตัวแปรทั้งหมดที่กำหนดด้วยคำหลัก VAR ในฟังก์ชั่นจะถูกยกขึ้นไปยังจุดเริ่มต้นของฟังก์ชัน (การทำงานที่ได้รับมอบหมายยังคงอยู่ในบรรทัดที่กำหนดโดย VAR) ซึ่งเรียกว่า Hoisting ใน JavaScript ตัวอย่างเช่นรหัสข้างต้นเทียบเท่ากับ:
การคัดลอกรหัสมีดังนี้:
การทำงาน(){
var a;
console.log (a); // undefined
a = "ทดสอบ";
console.log (a); // ทดสอบ
-
ห่วงโซ่ขอบเขตของตัวแปร
การติดต่อการจัดเก็บของตัวแปรใน JavaScript สามารถให้ความเข้าใจที่ดีเกี่ยวกับ "ขอบเขตฟังก์ชัน" และยกใน JS เนื่องจากตัวแปรจะถูกเก็บไว้ในวัตถุโกลบอลหรือวัตถุเรียกใช้ฟังก์ชันเมื่อกำหนดตัวแปรในฟังก์ชันไม่ว่าตัวแปรจะถูกกำหนดไว้ที่ใดในการเรียกใช้ฟังก์ชันคุณสมบัติที่มีชื่อเดียวกันกับตัวแปรนี้จะปรากฏขึ้นอย่างหลีกเลี่ยงไม่ได้ในวัตถุเรียกใช้ฟังก์ชันที่ใช้โดยการเรียกฟังก์ชันนี้ สิ่งนี้ช่วยให้สามารถเข้าถึงตัวแปรได้ทุกที่ในฟังก์ชั่น
เมื่อพูดถึงการเรียกใช้ฟังก์ชันมีแนวคิดที่น่าสนใจอีกอย่างหนึ่งใน JavaScript: ขอบเขตของตัวแปร - เนื่องจากตัวแปรถูกเก็บไว้ในวัตถุส่วนกลางหรือวัตถุเรียกใช้ฟังก์ชันเมื่อเข้าถึงตัวแปรคุณสามารถรับค่าจากหลายวัตถุ รหัสต่อไปนี้เป็นตัวอย่าง:
การคัดลอกรหัสมีดังนี้:
var x = "ทดสอบ";
การทำงาน(){
ฟังก์ชั่น // level-1
var x = "อุณหภูมิ";
การทำงาน(){
ฟังก์ชั่น // ระดับ 2
var x = "ของจริง";
// พยายามเข้าถึง x ที่นี่ X จะเป็น "ของจริง"
-
-
ภายในฟังก์ชั่นระดับ 2 ในโค้ดด้านบนเมื่อพยายามเข้าถึงตัวแปร X โปรแกรมสามารถค้นหาค่าแอตทริบิวต์ที่สอดคล้องกันจากวัตถุ 3 วัตถุ: วัตถุเรียกใช้ฟังก์ชันที่ใช้เรียกฟังก์ชันระดับ 2 วัตถุฟังก์ชั่นการเรียกใช้เพื่อเรียกฟังก์ชันระดับ 1 และวัตถุทั่วโลก - ตามความสัมพันธ์ที่ซ้อนกัน เมื่อเข้าถึงตัวแปรโปรแกรมจะเริ่มค้นหาจากวัตถุที่ใกล้เคียงกับคำสั่งการเข้าถึงมากที่สุด หากไม่พบการค้นหามันจะยังคงค้นหาในวัตถุในระดับก่อนหน้าในห่วงโซ่วัตถุจนกว่าวัตถุส่วนกลาง
เนื่องจากห่วงโซ่วัตถุนี้เกี่ยวข้องกับขอบเขตของตัวแปรจึงเรียกว่า "โซ่ขอบเขต"
หากคุณต้องการเปลี่ยนโซ่ขอบเขตชั่วคราวและแทรกวัตถุลงในปลายด้านหน้าของโซ่ขอบเขต (เป็นวัตถุฟังก์ชันที่เข้าถึงได้ก่อน) คุณสามารถใช้คำสั่งด้วย:
การคัดลอกรหัสมีดังนี้:
ด้วย (o) {
// รหัสใช้คุณสมบัติของวัตถุ o
-
อย่างไรก็ตามในโหมดที่เข้มงวด JavaScript โดยมีคำสั่งปิดใช้งาน แม้ในโหมดที่ไม่ได้ใช้งานไม่แนะนำให้ใช้คำสั่ง