Функсияҳои тирчадор ва замкунӣ
Ин барои чӣ лозим аст
Дар JavaScript функсия — қимат аст, мисли адад ё сатр. Онро ба тағйирёбанда гузоштан, ба функсияи дигар
додан, аз функсия баргардондан мумкин аст. Бисёр чиз бар ин асос ёфтааст: коркардкунандаҳои клик, усулҳои
массив map ва filter (мавзӯъҳои навбатӣ), таймерҳо, дархостҳо ба сервер. Ва навишти кӯтоҳи тирчадор
чунин кодро ихчам ва хоно мегардонад.
Ифодаи функсионалӣ
Функсияро сохта, ба тағйирёбанда гузоштан мумкин аст:
const greet = function (name) {
return `Салом, ${name}!`;
};
console.log(greet("Аня"));
Натиҷа:
Салом, Аня!
Ин ифодаи функсионалӣ аст. Фарқи он аз эълони function greet() {} — онро танҳо баъд аз сатре, ки
дар он сохта шудааст, даъват кардан мумкин аст.
Функсияҳои тирчадор
Ҳамон функсия кӯтоҳтар:
const greet = (name) => {
return `Салом, ${name}!`;
};
Ва агар тан як ифода бошад, қавсҳои фигурӣ ва return-ро хориҷ кардан мумкин аст: натиҷа худ ба худ бармегардад.
const greet = (name) => `Салом, ${name}!`;
const add = (a, b) => a + b;
const random = () => Math.random(); // бе параметрҳо — қавсҳои холӣ
const square = n => n * n; // як параметр — қавсҳоро партофтан мумкин
console.log(add(2, 3), square(5));
Натиҷа:
5 25
Бо объектҳо эҳтиёт шавед: барои дар шакли кӯтоҳ баргардондани объект онро дар қавсҳои доиравӣ мегиранд —
() => ({ ok: true }). Вагарна қавсҳои фигуриро тани функсия мешуморанд.
Функсияҳо ҳамчун аргумент: колбэкҳо
Функсияе, ки ба функсияи дигар медиҳанд, то он онро даъват кунад, колбэк (callback — «занг зан») меноманд:
function repeat(times, action) {
for (let i = 1; i <= times; i++) {
action(i);
}
}
repeat(3, (n) => console.log("Такрори №" + n));
Натиҷа:
Такрори №1
Такрори №2
Такрори №3
Функсияи repeat намедонад, ки чӣ кор кунад, — вай танҳо медонад, ки чанд маротиба. Чӣ кор карданро
даъваткунанда ҳал мекунад. setTimeout(колбэк, мс), addEventListener("click", колбэк) ва усулҳои массив
ҳамин тавр сохта шудаанд.
Функсияҳое, ки функсия бармегардонанд
function multiplier(k) {
return (n) => n * k;
}
const triple = multiplier(3);
const tenTimes = multiplier(10);
console.log(triple(5), tenTimes(5));
Натиҷа:
15 50
multiplier — «корхона»-и функсияҳо: ҳар даъват функсияи навро бо k-и худаш месозад.
Замкунӣ
Диққат диҳед: triple баъд аз он даъват мешавад, ки multiplier аллакай корашро тамом кардааст. Вай
k = 3-ро аз куҷо дар ёд дорад? Функсия дар JavaScript тағйирёбандаҳои ҷойеро, ки дар он сохта шудааст,
дар хотир нигоҳ медорад. Инро замкунӣ (closure) меноманд.
function makeGreeter(greeting) {
let calls = 0;
return (name) => {
calls++;
return `${greeting}, ${name}! (бори ${calls})`;
};
}
const hi = makeGreeter("Салом");
console.log(hi("Аня"));
console.log(hi("Тимур"));
Натиҷа:
Салом, Аня! (бори 1)
Салом, Тимур! (бори 2)
Тағйирёбандаи calls то вақте зинда аст, ки функсияи hi зинда аст, ва дар айни замон пинҳон аст: аз берун
онро иваз кардан мумкин нест. Ҳамин тавр дар JS додаҳои «хусусӣ» месозанд.
Дар дохил чӣ гуна кор мекунад
Ҳар даъвати функсия муҳит месозад — маҷмӯи тағйирёбандаҳои он. Одатан баъд аз баромадан аз функсия муҳит
партофта мешавад. Аммо агар дар дохил функсияи дигар сохта, онро ба берун баргардонанд, вай истинодро ба муҳит
нигоҳ медорад, ва муҳит зинда мемонад. Ҳар даъвати нави makeCounter() муҳити нав месозад — бинобар ин ду
ҳисобкунак ба ҳамдигар халал намерасонанд.
Функсияҳои тирчадор this ва prototype-и худро надоранд — бинобар ин онҳоро ҳамчун конструктор ва ҳамчун
усулҳои объект, ки ба онҳо this лозим аст, истифода намебаранд (дар ин бора — дар мавзӯи объектҳо).
Хатоҳои маъмул
- Қавсҳои фигурӣ бе
return.(n) => { n * 2 }undefinedбармегардонад. Ё қавсҳоро хориҷ кунед, ёreturnилова кунед. - Даъват ба ҷойи додан.
repeat(3, sayHi())натиҷаи даъватро медиҳад. Лозим астrepeat(3, sayHi). - Объект бе қавс.
() => { a: 1 }— ин тани функсия аст, на объект. Лозим аст() => ({ a: 1 }). - Тағйирёбандаи умумӣ берун аз корхона. Агар
let count = 0-ро берун азmakeCounterнависед, ҳамаи ҳисобкунакҳо як ададро тақсим мекунанд. - Даъвати ифода пеш аз сохта шудан.
const f = …-ро болотар аз ин сатр даъват кардан мумкин нест.
Ёддошт
| Чӣ | Чӣ тавр |
|---|---|
| Ифода | const f = function (x) { return x; }; |
| Тирча бо тан | const f = (x) => { return x * 2; }; |
| Тирчаи кӯтоҳ | const f = (x) => x * 2; |
| Бе параметрҳо | () => 42 |
| Баргардондани объект | () => ({ ok: true }) |
| Колбэк | repeat(3, (i) => console.log(i)) |
| Замкунӣ | функсия тағйирёбандаҳои ҷойи сохташавиашро дар ёд дорад |