this և bind/apply/call մեթոդները
this և bind/apply/call մեթոդները օբյեկտների կոնտեքստում JavaScript-ում
JavaScript-ում this հատուկ keyword է, որը վերաբերում է այն օբյեկտին, որի կոնտեքստում տվյալ կոդը աշխատում է։ Բայց քանի որ JavaScript-ը ունի դինամիկ կոնտեքստ, this-ը կարող է փոփոխվել՝ կախված նրանից, թե ինչպես է կանչվում ֆունկցիան։
Օբյեկտների հետ աշխատելիս this-ը հաճախ շփոթեցնող է լինում։ Այս հոդվածում կնայենք ինչպես է աշխատում this-ը օբյեկտների կոնտեքստում և ինչպես կարելի է այն վերահսկել bind, call և apply մեթոդների միջոցով։
const user = {
name: 'Anna',
greet() {
console.log(`Hi, I'm ${this.name}`);
}
};
user.greet(); // Hi, I'm Anna
Այստեղ this-ը մատնանշում է user օբյեկտին, քանի որ greet-ը կանչվում է user.greet() ձևով։
const user = {
name: 'Anna',
greet() {
console.log(`Hi, I'm ${this.name}`);
}
};
setTimeout(user.greet, 1000); // Hi, I'm undefined (կամ error strict mode-ում)
Երբ user.greet փոխանցում ենք առանց կանչելու, this-ը կորցնում է իր սկզբնական կոնտեքստը և դառնում է undefined կամ window (ոչ strict mode-ում):
bind()
const user = {
name: 'Anna',
greet() {
console.log(`Hi, I'm ${this.name}`);
}
};
const boundGreet = user.greet.bind(user);
setTimeout(boundGreet, 1000); // Hi, I'm Anna
bind() վերադարձնում է նոր ֆունկցիա՝ որի this-ը մշտապես կապված է user օբյեկտին։
Առավելություններ:
call() և apply() մեթոդները
function introduce(city, country) {
console.log(`${this.name} from ${city}, ${country}`);
}
const person = { name: 'Mariam' };
introduce.call(person, 'Yerevan', 'Armenia'); // Mariam from Yerevan, Armenia
introduce.apply(person, ['Gyumri', 'Armenia']); // Mariam from Gyumri, Armenia
call() և apply() մեթոդները անմիջապես կանչում են ֆունկցիան՝ փոխելով this-ը։ Մինչդեռ bind() վերադարձնում է նոր ֆունկցիա՝ առանց կանչելու այն։
Տարբերությունը call-ի և apply-ի միջև․
call() ընդունում է արգումենտները որպես առանձին արժեքներapply() ընդունում է արգումենտները որպես զանգված
const obj = {
name: 'Mark',
outer() {
console.log(this.name); // Mark
function inner() {
console.log(this.name); // undefined
}
inner();
}
};
obj.outer();
Ներսի inner() ֆունկցիան սովորական ֆունկցիա է, ոչ մեթոդ, այդ պատճառով this-ը կորցնում է կապը։
Արդյունքները կարող ենք լուծել՝ օգտագործելով․
this
// Arrow function լուծում
outer() {
console.log(this.name);
const inner = () => {
console.log(this.name); // ճիշտ this
};
inner();
}
const button = document.querySelector('button');
const user = {
name: 'Ani',
handleClick() {
console.log(`Clicked by ${this.name}`);
}
};
button.addEventListener('click', user.handleClick.bind(user));
Եթե bind() չօգտագործենք, this-ը կդառնա button DOM էլեմենտը։
this-ը JavaScript-ում միշտ կախված է այն բանից, թե ինչպես է ֆունկցիան կանչվում։ Օբյեկտների կոնտեքստում այն հիմնական գործիքներից է՝ կոդի կառուցվածքը կառավարելու համար։ bind(), call(), և apply() մեթոդները թույլ են տալիս վերահսկել կոնտեքստը և ստեղծել մաքուր, կանխատեսելի կոդ։