Scope

Scope, kodun icra olunması zamanı dəyərlərin və funksiyaların görünür olduğu əhatə dairəsidir.

JavaScript-də üç əsas scope növü var:

  • Global Scope
  • Function Scope
  • Block Scope

var: global scope, function scope. letconst: global scope, function scope, block scope.

Global Scope

JavaScript faylında kod yazmağa başladığınız zaman, bu kod global scope-da yerləşir. Global scope-da təyin olunan dəyişənlər hər yerdən əlcatandır. Bir JavaScript faylında yalnız bir qlobal scope var.

var name = "Ramiz";
console.log(name); // Ramiz

Qlobal scope-da olan dəyişənlər hər yerdən əlcatandır və onları dəyişmək mümkündür.

var name = "Ramiz";
console.log(name); // Ramiz

function displayName() {
  console.log(name); // Ramiz
}
displayName(); // Ramiz

Function Scope

Bir dəyişən funksiyanın daxilində təyin olunubsa, bu dəyişən yalnız həmin funksiyanın daxilində əlçatandır.

function greet() {
  var message = "Salam!";
  console.log(message); // Salam!
}

greet();
console.log(message); // message is not defined

Bu misalda, message dəyişəni yalnız greet funksiyası daxilində mövcuddur. Funksiya xaricində bu dəyişənə çatmaq mümkün deyil.

Block Scope

letconst açar sözləri ilə təyin olunan dəyişənlər yalnız daxil olduqları blokda əlçatandır. Bu blok ifadələri if, forwhile kimi şərt və dövr ifadələrinin daxilində yaradıla bilər.

if (true) {
  let age = 28;
  const name = "Ramiz";
}
console.log(age); // age is not defined
console.log(name); // name is not defined

amma var açar sözündə block scope yoxdur:

if (true) {
  var name = "Ramiz";
  let surname = "Ramizov";
}
console.log(name); // Ramiz
console.log(surname); // surname is not defined

Qlobal Scope proqram davam etdiyi müddətcə yaşayır. Function Scope isə funksiyalar çağırılıb icra olunana qədər mövcuddur.

Scope Chain

Scope chain JavaScript-də dəyişənlərin axtarılması prosesini izah edir. Daxili (nested) scope-lar əvvəlcə öz daxilindəki dəyişənləri yoxlayır. Əgər dəyişən tapılmasa, JavaScript xarici scope-lara baxır. Dəyişən heç bir xarici əhatə dairəsində tapılmadıqda, error verir.

function outerFunction() {
  const name = "Ramiz";

  function innerFunction() {
    console.log(name); // "Ramiz"
    console.log(lastName); // lastName is not defined
  }
  innerFunction();
}
outerFunction();

Bu kodda outerFunction çağırılır və onun içindəki innerFunction funksiyası da iş düşür. innerFunction daxilində name dəyişəni yoxlanılır. Bu dəyişən innerFunction daxilində təyin edilmədiyi üçün JavaScript scope chain-dən istifadə edərək daha geniş scope-lara baxır. yəni bir yuxarı outerFunction-a

outerFunction daxilindəki scope-da name tapılır və onun dəyəri “Ramiz” ekrana yazılır. Lakin lastName dəyişəni nə innerFunction daxilində, nə də outerFunction daxilində deyil yenə scope chain-dən istifadə edərək bir yuxarı daha gedirik qlobal scopa-a. Qlobal scope-da da bu dəyişən tapılmadığı üçün error verir

Bu nümunə, scope chain-in necə işlədiyini göstərir. Əgər bir dəyişən daxili scope-da tapılmırsa, JavaScript xarici scope-lara baxaraq dəyişəni tapmağa çalışır. Əgər heç bir yerdə tapılmırsa, səhv baş verir.

Başqa bir nümünə:

const lastName = "Smith";
function outerOuterFunction() {
  const lastName = "Ramizov";
  function outerFunction() {
    const name = "Ramiz";

    function innerFunction() {
      console.log(name); // "Ramiz"
      console.log(lastName); // "Ramizov"
    }
    innerFunction();
  }
  outerFunction();
}
outerOuterFunction();

Bu kodda scope chain mexanizmi innerFunction içində lastName dəyişənini axtardıqda, ilk olaraq outerFunction daxilinə baxir lastName-i tapmır. Sonra outerOuterFunction daxilinə baxır lastName-i (yəni “Ramizov”) tapır və tapdığı üçün qlobal scope-dakı lastName (yəni “Smith”) baxmır