ÐовеÑнемоÑÑ Ð´Ð¾ ÑÑÑÑÐ»ÐºÐ¾Ð²Ð¸Ñ ÑÑнкÑÑй.
СÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ â Ñе не пÑоÑÑо «ÑкоÑоÑеннÑ» Ð´Ð»Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð½Ñ ÑÑÑлÑÐºÐ¸Ñ Ð´ÑÑбниÑÑ. Ðони маÑÑÑ Ð´ÐµÑÐºÑ Ð´Ñже ÑпеÑиÑÑÑÐ½Ñ Ñа коÑиÑÐ½Ñ Ð¾ÑобливоÑÑÑ.
ÐÑи напиÑÐ°Ð½Ð½Ñ JavaScript-ÐºÐ¾Ð´Ñ ÑаÑÑо виникаÑÑÑ ÑиÑÑаÑÑÑ, коли поÑÑÑбно напиÑаÑи Ð½ÐµÐ²ÐµÐ»Ð¸ÐºÑ ÑÑнкÑÑÑ, Ñка бÑде виконана деÑÑ Ñе.
ÐапÑиклад:
arr.forEach(func)âfuncвиконÑÑÑÑÑÑforEachÐ´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ елеменÑа маÑивÑ.setTimeout(func)âfuncвиконÑÑÑÑÑÑ Ð²Ð±Ñдованим планÑвалÑником.- â¦ÑоÑо.
СÑвоÑÐµÐ½Ð½Ñ ÑÑнкÑÑÑ Ñа пеÑедаÑа ÑÑ ÐºÑдиÑÑ â Ñе в дÑÑÑ JavaScript.
Рв ÑÐ°ÐºÐ¸Ñ ÑÑнкÑÑÑÑ Ð¼Ð¸ зазвиÑай не Ñ Ð¾Ñемо Ð²Ð¸Ñ Ð¾Ð´Ð¸Ñи з поÑоÑного конÑекÑÑÑ. Ð ÑÐ°ÐºÐ¸Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ°Ñ Ñ ÐºÐ¾ÑиÑÐ½Ñ ÑÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ.
СÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ Ð½Ðµ маÑÑÑ âthisâ
Як ми памâÑÑаÑмо з ÑоздÑÐ»Ñ ÐеÑоди обâÑкÑа, "this", ÑÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ Ð½Ðµ маÑÑÑ this. ЯкÑо вÑдбÑваÑÑÑÑÑ Ð·Ð²ÐµÑÐ½ÐµÐ½Ð½Ñ Ð´Ð¾ this, його знаÑÐµÐ½Ð½Ñ Ð±ÐµÑеÑÑÑÑ Ð·Ð·Ð¾Ð²Ð½Ñ.
ÐапÑиклад, ми можемо викоÑиÑÑовÑваÑи Ñе Ð´Ð»Ñ ÑÑеÑаÑÑÑ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ Ð¼ÐµÑÐ¾Ð´Ñ Ð¾Ð±âÑкÑа:
let group = {
title: "ÐаÑа гÑÑпа",
students: ["Ðван", "ÐеÑÑо", "ÐаÑÑÑ"],
showList() {
this.students.forEach(
student => alert(this.title + ': ' + student)
);
}
};
group.showList();
ТÑÑ Ñ forEach викоÑиÑÑовÑÑÑÑÑÑ ÑÑÑÑлкова ÑÑнкÑÑÑ, ÑÐ¾Ð¼Ñ this.title Ñ Ð½Ñй Ð¼Ð°Ñ Ñаке ж Ñаме знаÑеннÑ, Ñк Ñ Ñ Ð¼ÐµÑÐ¾Ð´Ñ showList, â group.title.
Якби ми викоÑиÑÑали âзвиÑайнÑâ ÑÑнкÑÑÑ, бÑла б помилка:
let group = {
title: "ÐаÑа гÑÑпа",
students: ["Ðван", "ÐеÑÑо", "ÐаÑÑÑ"],
showList() {
this.students.forEach(function(student) {
// Error: Cannot read property 'title' of undefined
alert(this.title + ': ' + student);
});
}
};
group.showList();
Ðомилка Ð²Ð¸Ð½Ð¸ÐºÐ°Ñ ÑеÑез Ñе, Ñо forEach запÑÑÐºÐ°Ñ ÑÑнкÑÑÑ Ð· this=undefined за замовÑÑваннÑм, ÑÐ¾Ð¼Ñ Ð¼Ð¸ намагаÑмоÑÑ Ð·Ð²ÐµÑнÑÑиÑÑ Ð´Ð¾ undefined.title.
Це не Ð²Ð¿Ð»Ð¸Ð²Ð°Ñ Ð½Ð° ÑÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ, ÑÐ¾Ð¼Ñ Ñо вони не маÑÑÑ Ð²Ð»Ð°Ñного this.
newÐÑдÑÑÑнÑÑÑÑ this пÑизводиÑÑ Ð´Ð¾ Ñе одного обмеженнÑ: ÑÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ Ð½Ðµ можÑÑÑ Ð±ÑÑи викоÑиÑÑÐ°Ð½Ñ Ñк конÑÑÑÑкÑоÑи. ÐÑ
не можна викликаÑи з new.
ÐÑж ÑÑÑÑÐ»ÐºÐ¾Ð²Ð¾Ñ ÑÑнкÑÑÑÑ => Ñа звиÑÐ°Ð¹Ð½Ð¾Ñ ÑÑнкÑÑÑÑ, Ñо викликаÑÑÑÑÑ Ð· .bind(this) Ñ Ð½ÐµÐ²ÐµÐ»Ð¸Ñка ÑÑзниÑÑ:
.bind(this)ÑÑвоÑÑÑ âзвâÑÐ·Ð°Ð½Ñ Ð²ÐµÑÑÑÑâ ÑÑнкÑÑÑ.- СÑÑÑлка
=>не ÑÑвоÑÑÑ Ð¶Ð¾Ð´Ð½Ð¸Ñ Ð¿ÑивâÑзок. Ð¦Ñ ÑÑнкÑÑÑ Ð¿ÑоÑÑо не маÑthis. ÐоÑÑкthisздÑйÑнÑÑÑÑÑÑ Ñак Ñамо, Ñк Ñ Ð·Ð²Ð¸Ñайний поÑÑк змÑÐ½Ð½Ð¸Ñ : Ñ Ð·Ð¾Ð²Ð½ÑÑнÑÐ¾Ð¼Ñ Ð»ÐµÐºÑиÑÐ½Ð¾Ð¼Ñ ÑеÑедовиÑÑ.
СÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ Ð½Ðµ маÑÑÑ âargumentsâ
СÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ Ñакож не маÑÑÑ Ð·Ð¼ÑÐ½Ð½Ð¾Ñ arguments.
Це ÑÑдово пÑдÑ
одиÑÑ Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð´ÐµÐºÐ¾ÑаÑоÑÑв, коли нам поÑÑÑбно пÑокинÑÑи виклик з поÑоÑними this Ñа arguments.
ÐапÑиклад, defer(f, ms) пÑÐ¸Ð¹Ð¼Ð°Ñ ÑÑнкÑÑÑ Ñ Ð¿Ð¾Ð²ÐµÑÑÐ°Ñ Ð¾Ð±Ð³Ð¾ÑÑÐºÑ Ð½Ð°Ð´ неÑ, Ñка вÑÐ´ÐºÐ»Ð°Ð´Ð°Ñ Ð²Ð¸ÐºÐ»Ð¸Ðº на ms мÑлÑÑекÑнд:
function defer(f, ms) {
return function() {
setTimeout(() => f.apply(this, arguments), ms);
};
}
function sayHi(who) {
alert('ÐÑивÑÑ, ' + who);
}
let sayHiDeferred = defer(sayHi, 2000);
sayHiDeferred("Ðван"); // "ÐÑивÑÑ, Ðван" ÑеÑез 2 ÑекÑнди
Те ж Ñаме без ÑÑÑÑÐ»ÐºÐ¾Ð²Ð¾Ñ ÑÑнкÑÑÑ Ð²Ð¸Ð³Ð»ÑдаÑиме Ñак:
function defer(f, ms) {
return function(...args) {
let ctx = this;
setTimeout(function() {
return f.apply(ctx, args);
}, ms);
};
}
ТÑÑ Ð½Ð°Ð¼ довелоÑÑ ÑÑвоÑиÑи додаÑÐºÐ¾Ð²Ñ Ð·Ð¼ÑÐ½Ð½Ñ args and ctx, Ñоб ÑÑнкÑÑÑ Ð²ÑеÑÐµÐ´Ð¸Ð½Ñ setTimeout могла ÑÑ
пÑийнÑÑи.
ÐÑдÑÑмки
СÑÑÑÐ»ÐºÐ¾Ð²Ñ ÑÑнкÑÑÑ:
- Ðе маÑÑÑ
this - Ðе маÑÑÑ
arguments - Ðе можÑÑÑ Ð±ÑÑи Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ð½Ñ Ð·
new - Також вони не маÑÑÑ
super, але до ÑÑÑÑ Ñеми ми Ñе не дÑйÑли. Ðи пÑо Ñе поговоÑимо Ñ ÑоздÑÐ»Ñ ÐаÑлÑдÑÐ²Ð°Ð½Ð½Ñ ÐºÐ»Ð°ÑÑ
Це вÑе ÑомÑ, Ñо вони пÑизнаÑÐµÐ½Ñ Ð´Ð»Ñ Ð½ÐµÐ²ÐµÐ»Ð¸ÑÐºÐ¸Ñ ÑÑагменÑÑв кодÑ, ÑÐºÑ Ð½Ðµ маÑÑÑ Ð²Ð»Ð°Ñного âконÑекÑÑÑâ, а ÑкоÑÑÑе пÑаÑÑÑÑÑ Ñ Ð¿Ð¾ÑоÑномÑ. Рвони дÑйÑно дÑже добÑе впоÑÑÑÑÑÑÑ Ð· Ñим завданнÑм.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)