Middle
JavaScript-də kontekstin dəyişməsini necə qadağan etmək olar?
sobes.tech Süni İntellekt
AI-dan cavab
JavaScript-də funksiyanın icra konteksti (this dəyəri) dinamik olaraq çağırış anında müəyyən edilir. Onun dəyişdirilməsini tamamilə qadağan etmək mümkün deyil, amma onu müxtəlif üsullarla idarə etmək və ya sabitləşdirmək olar:
-
call,apply,bindmetodları:callvəapplyfunksiyanı açıq şəkildə kontekst və arqumentlərlə çağırmağa imkan verir (callayrı arqumentlər,applyisə massiv şəklində).bindyeni bağlanmış funksiya yaradır, onunthisdəyəri yaradılma zamanı sərt şəkildə təyin edilir, sonrakı çağırışlardan asılı olmayaraq. Bu, gələcək çağırışlar üçün "konteksti" "qadağan etməyin" ən effektiv yoludur.
// bind ilə nümunə const obj = { value: 42 }; function showValue() { console.log(this.value); } const boundShowValue = showValue.bind(obj); boundShowValue(); // 42 göstərəcək boundShowValue.call({ value: 100 }); // Hələ də 42 göstərəcək, kontekst sərt şəkildə təyin olunub -
Ox funksiyaları (Arrow Functions):
- Ox funksiyaları öz
this-ə malik deyil. Onlarthis-i ətraf mühitdən tərif zamanı ələ keçirirlər. - Ox funksiyasının konteksti
call,apply, və yabindilə dəyişdirilə bilməz.
// Ox funksiyası ilə nümunə const outerObj = { name: 'Outer' }; class MyClass { constructor() { this.className = 'MyClass'; this.showNameArrow = () => { // `this` burada `MyClass`-ın konstruktorundan və ya tərif mühitindən ələ keçir console.log(this.className); }; } showNameRegular() { // `this` burada çağırış zamanı müəyyən edilir console.log(this.className); } } const instance = new MyClass(); instance.showNameArrow(); // 'MyClass' göstərəcək const anotherObj = { className: 'Another' }; const boundArrow = instance.showNameArrow.bind(anotherObj); // Konteksti dəyişdirməyə cəhd boundArrow(); // Yenə 'MyClass' göstərəcək, ox funksiyasının konteksti dəyişməz instance.showNameRegular.call(anotherObj); // 'Another' göstərəcək, adi funksiyanın konteksti dəyişir - Ox funksiyaları öz
Qısaca, "kontekstin dəyişdirilməsini qadağan etmək" daha yaxşı kontekstin sərt şəkildə bağlanması kimi başa düşülür. Bunun üçün bind adi funksiyalar üçün və təbii leksik bağlama üçün istifadə olunur. Ox funksiyaları bu baxımdan daha "dəyişməz" sayılır.