Skip to content

Latest commit

 

History

History
54 lines (37 loc) · 6.22 KB

Functional Programming in Modern JavaScript Development.md

File metadata and controls

54 lines (37 loc) · 6.22 KB

Արժեքների ո՞ր տիպին են պատկանում ֆունկցիաները: Բարձր կարգի ֆունկցիաներն (higher-order functions) ու ծրագրավորման ֆունկցիոնալ հայեցակարգը:

Ինչպես գիտենք ֆունկցիաները JavaScript-ում հանդիսանում են արժեքներ, և ամեն արժեք ունի իր տիպը։ Իսկ ո՞ր տիպին են պատկանում ֆունկցիաները։ JavaScript-ում ֆունկցիաները հանդիսանում են օբյեկտներ։ Ֆունկցիաներին կարելի է ոչ միայն կանչել, այլ նաև օգտագործել որպես սովորական օբյեկտներ, օրինակ նրանց մեջ ավելացնել/ջնջել հատկություններ։ Ստեղծենք պարզագույն ֆունկցիա, որի գործառույթը կլինի իրար գումարել և վերադարձնել տրված երկու արգումենտները։

function sum(a, b) {
  return a + b;
}

Եթե հիմա մենք typeof օպերատորի օգնությամբ ստուգենք sum-ի տիպը՝ typeof sum, ապա կստանանք "function"։ Ֆորմալ առումով սա ճիշտ չէ, քանի-որ JavaScript-ում չկա այդպիսի առանձին տվյալների տիպ, սակայն դա արվել է գործնական նպատակահարմարությունից ելնելով։ Որպեսզի իրոք համոզվենք, որ ֆունկցիաներն օբյեկտներ են, մենք կարող ենք նրանց մեջ ստեղծել հատկություններ, ինչպես որ սովորաբար օբյեկտների հետ ենք անում։

sum.prop = "test";

Այժմ sum ֆունկցիայի մեջ կա prop հատկությունը՝ ինչ-որ "test" տեքստային արժեքով։ Եվ մենք կարող ենք օրինակ alert անել sum.prop-ը, դրանում համոզվելու համար։

Այս հնարքները գործնականում կարող են օգտագործվել տարբեր խնդիրների լուծման համար։ Օրինակ մեզ կարող է անհրաժեշտ լինել հաշվել թե քանի անգամ է ֆունկցիան կանչվել սքրիփթի մեջ։ Դրա համար ընդամենը պետք է ստեղծել ինչ-որ count հատկություն, որը կպահի հաշիվը, և ամեն անգամ ֆունկցիայի կանչի ժամանակ նրա արժեքը մեկով ավելացնել։

function sum(a, b) {
  sum.count++;
  return a + b;
}

sum.count = 0;

Ունենք sum ֆունկցիան, որը վերադարձնում է տրված երկու արգումենտների գումարը, և ամեն կանչի ժամանակ իր count հատկության արժեքը ավելացնում է մեկով։ Անմիջապես ֆունկցիան հայտարարելուց հետո տալիս ենք նաև count հատկության նախնական արժեքը՝ 0։ Եվ այժմ եթե ֆունկցիան կանչվի, յուրաքանչյուր կանչը կավելացնի count-ի արժեքը մեկով։

sum(5, 3); // 8
sum(2, 1); // 3
alert(sum.count); // 2

Ֆունկցիան ունի նաև մի շարք ներդրված հատկություններ, որոնք մենք կարող ենք ստանալ։ Օրինակ եթե alert անենք sum ֆունկցիայի name հատկությունը, կստանանք հենց ֆունկցիայի անվանումը։

alert(sum.name); // "sum"

Կա նաև length ներդրված հատկությունը, որը պարունակում է ֆունկցիայի հայտարարման ժամանակ նրան տրված պարամետրերի քանակը։

alert(sum.length); // 2

JavaScript ծրագրավորման լեզվում ֆունկցիաները բարձր կարգի են (Higher-Order Function), սա նշանակում է, որ ֆունկցիան որպես պարամետր կարող է ընդունել ուրիշ ֆունկցիա, կամ որպես արդյունք նույնպես վերադարձնել ինչ-որ ֆունկցիա։ JavaScript-ով կոդ գրելիս, սա շատ սովորական և տրամաբանական է թվում, սակայն պետք է ասել, որ ոչ բոլոր լեզուներում է հնարավոր ֆունկցիաները նման կերպ օգտագործել, և բարձր կարգի ֆունկցիաների առկայությունը համարվում է JavaScript-ի ամենաուժեղ կողմերից մեկը։ Այն ապահովում է աբստրակցիայի բարձր մակարդակ, թույլ է տալիս գրել ավելի համառոտ կոդ, և բարդ ու խճճված գործողությունները կատարել պարզ եղանակներով։

JavaScript-ի մեջ շատ կան ներդրված բարձր կարգի ֆունկցիաներ։ Օրինակ զանգվածների բոլոր մեթոդները որպես արգումենտ ստանում են հետադարձ կանչի (callback) ֆունկցիաներ, և զանգվածի էլեմենտների հետ աշխատում են ըստ այդ հետադարձ կանչի ֆունկցիաներում տրված տրամաբանության։ Բարձր կարգի ֆունկցիաների ունակությունը՝ վերադարձնել մեկ այլ ֆունկցիա, նույնպես հաճախ է կիրառվում, մասնավորապես closure-ների ստեղծման ժամանակ։

Ֆունկցիաների՝ ինչպես սովորական արժեքների հետ աշխատանքի սկզբունքը և բարձր կարգի ֆունկցիաների առկայությունը թույլ են տալիս JavaScript ծրագրավորման լեզվում որպես մոտեցում, որպես ոճ օգտագործել ֆունկցիոնալ ծրագրավորման հայեցակարգը։ Այն հանդիսանում է արժանի այլընտրանք օբյեկտ կողմնորոշված ծրագրավորման (OOP) հայեցակարգին և լայնորեն օգտագործվում է։