Гузариш ба мундариҷа
Мавзӯи 8 аз 16
Назария

Функсияҳои тирчадор ва замкунӣ

Ин барои чӣ лозим аст

Дар 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 лозим аст, истифода намебаранд (дар ин бора — дар мавзӯи объектҳо).

Хатоҳои маъмул

  1. Қавсҳои фигурӣ бе return. (n) => { n * 2 } undefined бармегардонад. Ё қавсҳоро хориҷ кунед, ё return илова кунед.
  2. Даъват ба ҷойи додан. repeat(3, sayHi()) натиҷаи даъватро медиҳад. Лозим аст repeat(3, sayHi).
  3. Объект бе қавс. () => { a: 1 } — ин тани функсия аст, на объект. Лозим аст () => ({ a: 1 }).
  4. Тағйирёбандаи умумӣ берун аз корхона. Агар let count = 0-ро берун аз makeCounter нависед, ҳамаи ҳисобкунакҳо як ададро тақсим мекунанд.
  5. Даъвати ифода пеш аз сохта шудан. 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))
Замкунӣ функсия тағйирёбандаҳои ҷойи сохташавиашро дар ёд дорад

Тирча

Осон+10 XP

Доимии double-ро созед — функсияи тирчадор, ки ададро зарб дар 2 бармегардонад.

double(4)   → 8
double(-5)  → -10

Барои ҳал кардани масъалаҳо коннекторро пайваст кун

Коди масъалаҳо дар компютери худат иҷро мешавад — ин аз браузер тезтар ва боэътимодтар аст. Барои ин барномаи ройгони коннектори CodeWithMe лозим аст. Онро як бор пайваст кардан кифоя аст.

Коннекторро дар ин компютер ҷустуҷӯ мекунем…

  1. 1
    Коннекторро барои системаи худ (Windows, macOS ё Linux) зеркашӣ кун.Зеркашии коннекторДар саҳифаи зеркашӣ файлеро интихоб кун, ки дар номаш системаи ту ҳаст, масалан windows-amd64.
  2. 2Онро иҷро кун ва ҷузвдонеро интихоб кун, ки ҳалҳоят дар он ҷо меистанд. Python ва Node.js-ро ӯ худаш ҳангоми зарурат ба он ҷо мегузорад.
  3. 3
    Дар поён рамзи 6-рақамаро ворид кун — он дар равзанаи коннектор навишта шудааст («Рамз барои сайти CodeWithMe»). Агар браузер дар бораи дастрасӣ ба шабакаи маҳаллӣ пурсад — иҷозат деҳ.

Коннектор кушода аст (рамзи манбаъ дар GitHub), танҳо дар компютери ту кор мекунад ва кодро танҳо пас аз ворид кардани рамзи пайвастшавӣ иҷро мекунад.