ÐавайÑе веÑнÑмÑÑ Ðº ÑÑÑелоÑнÑм ÑÑнкÑиÑм.
СÑÑелоÑнÑе ÑÑнкÑии â ÑÑо не пÑоÑÑо «ÑокÑаÑение», ÑÑÐ¾Ð±Ñ Ð¼ÐµÐ½ÑÑе пиÑаÑÑ. У Ð½Ð¸Ñ ÐµÑÑÑ ÑÑд дÑÑÐ³Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½ÑÑ Ð¾ÑобенноÑÑей.
ÐÑи напиÑании JavaScript-кода ÑаÑÑо возникаÑÑ ÑиÑÑаÑии, когда нам нÑжно напиÑаÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑÑÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²Ñполнена где-Ñо еÑÑ.
ÐапÑимеÑ:
arr.forEach(func)âfuncвÑполнÑеÑÑÑforEachÐ´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа маÑÑива.setTimeout(func)âfuncвÑполнÑеÑÑÑ Ð²ÑÑÑоеннÑм планиÑовÑиком.- â¦Ð¸ Ñак далее.
ÐÑо оÑÐµÐ½Ñ Ð² дÑÑ Ðµ JavaScript â ÑоздаÑÑ ÑÑнкÑÐ¸Ñ Ð¸ пеÑедаÑÑ ÐµÑ ÐºÑда-нибÑдÑ.
Рв ÑÐ°ÐºÐ¸Ñ ÑÑнкÑиÑÑ Ð¼Ñ Ð¾Ð±ÑÑно не Ñ Ð¾Ñим вÑÑ Ð¾Ð´Ð¸ÑÑ Ð¸Ð· ÑекÑÑего конÑекÑÑа. ÐдеÑÑ ÐºÐ°Ðº Ñаз и Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ ÑÑÑелоÑнÑе ÑÑнкÑии.
У ÑÑÑелоÑнÑÑ ÑÑнкÑий Ð½ÐµÑ Â«this»
Ðак Ð¼Ñ Ð¿Ð¾Ð¼Ð½Ð¸Ð¼ из Ð³Ð»Ð°Ð²Ñ ÐеÑÐ¾Ð´Ñ Ð¾Ð±ÑекÑа, "this", Ñ ÑÑÑелоÑнÑÑ
ÑÑнкÑий Ð½ÐµÑ this. ÐÑли пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¾Ð±ÑаÑение к this, его знаÑение беÑÑÑÑÑ ÑнаÑÑжи.
ÐапÑимеÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÑÑо Ð´Ð»Ñ Ð¸ÑеÑаÑии внÑÑÑи меÑода обÑекÑа:
let group = {
title: "Our Group",
students: ["John", "Pete", "Alice"],
showList() {
this.students.forEach(
student => alert(this.title + ': ' + student)
);
}
};
group.showList();
ÐдеÑÑ Ð²Ð½ÑÑÑи forEach иÑполÑзована ÑÑÑелоÑÐ½Ð°Ñ ÑÑнкÑиÑ, Ñаким обÑазом this.title в ней бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ ÑоÑно Ñакое же знаÑение, как в меÑоде showList: group.title.
ÐÑли Ð±Ñ Ð¼Ñ Ð¸ÑполÑзовали «обÑÑнÑÑ» ÑÑнкÑиÑ, бÑла Ð±Ñ Ð¾Ñибка:
let group = {
title: "Our Group",
students: ["John", "Pete", "Alice"],
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('Hello, ' + who);
}
let sayHiDeferred = defer(sayHi, 2000);
sayHiDeferred("John"); // вÑÐ²Ð¾Ð´Ð¸Ñ "Hello, John" ÑеÑез 2 ÑекÑндÑ
То же Ñамое без ÑÑÑелоÑной ÑÑнкÑии вÑглÑдело Ð±Ñ Ñак:
function defer(f, ms) {
return function(...args) {
let ctx = this;
setTimeout(function() {
return f.apply(ctx, args);
}, ms);
};
}
ÐдеÑÑ Ð¼Ñ Ð±Ñли вÑнÑÐ¶Ð´ÐµÐ½Ñ ÑоздаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе пеÑеменнÑе args и ctx, ÑÑÐ¾Ð±Ñ ÑÑнкÑÐ¸Ñ Ð²Ð½ÑÑÑи setTimeout могла полÑÑиÑÑ Ð¸Ñ
.
ÐÑого
СÑÑелоÑнÑе ÑÑнкÑии:
- Ðе имеÑÑ
this. - Ðе имеÑÑ
arguments. - Ðе могÑÑ Ð±ÑÑÑ Ð²ÑÐ·Ð²Ð°Ð½Ñ Ñ
new. - (У ниÑ
Ñакже неÑ
super, но Ð¼Ñ Ð¿Ñо ÑÑо не говоÑили. ÐÑо ÑÑо бÑÐ´ÐµÑ Ð² главе ÐаÑледование клаÑÑов).
ÐÑÑ ÑÑо поÑомÑ, ÑÑо они пÑедназнаÑÐµÐ½Ñ Ð´Ð»Ñ Ð½ÐµÐ±Ð¾Ð»ÑÑого кода, коÑоÑÑй не Ð¸Ð¼ÐµÐµÑ Ñвоего «конÑекÑÑа», вÑполнÑÑÑÑ Ð² ÑекÑÑем. Рони оÑлиÑно ÑпÑавлÑÑÑÑÑ Ñ ÑÑой задаÑей!
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)