Функциялар
Функциялар
Көп учурда биз программанын көптөгөн бөлүктөрүндө бир эле аракетти кайталашыбыз керек.
Мисалы, конок менен учурашканда, конок сайттан чыгып кеткенде же башка жерде билдирүүнү кооз көрсөтүү керек.
Бир эле кодду көп жерлерде кайталабоо үчүн функциялар ойлоп табылган. Функциялар программанын негизги "курулуш материалы" болуп саналат.
Сиз буга чейин көргөн камтылган функциялардын мисалдары: эскертүү (билдирүү), эскертүү (билдирүү, демейки) жана ырастоо (суроо). Бирок сиз өзүңүздүн да түзө аласыз.
Функция декларациясы
Функцияларды түзүү үчүн функция декларациясын колдонсок болот.
Функцияны жарыялоонун мисалы:
showMessage() функциясы {
alert( 'Баарына салам!' );
}
Алгач функциянын ачкыч сөзү келет, андан кийин функциянын аты, андан кийин үтүр менен бөлүнгөн кашаанын ичиндеги параметрлердин тизмеси (жогорку мисалда ал бош) жана акырында функциянын коду, ошондой эле "функциянын денеси" деп аталат. ", тармал кашаанын ичинде.
функциянын аты (параметрлери) {
...дене...
}
Биздин жаңы функциябыз анын аты менен аталат: showMessage().
Мисалы:
showMessage() функциясы {
alert( 'Баарына салам!' );
}
showMessage();
showMessage();
showMessage() чалуу функциянын кодун аткарат. Бул жерде биз кабарды эки жолу көрөбүз.
Бул мисал функциялардын негизги максаттарынын бирин ачык көрсөтүп турат: кодду кайталоодон кутулуу.
Эгер билдирүүнү же анын көрсөтүлүшүн өзгөртүү керек болсо, аны бир жерден өзгөртүү жетиштүү: аны көрсөткөн функцияда.
Жергиликтүү өзгөрмөлөр
Функциянын ичинде жарыяланган өзгөрмөлөр ошол функциянын ичинде гана көрүнөт.Мисалы:
showMessage() функциясы {
let message = "Салам, мен JavaScriptмин!"; // жергиликтүү өзгөрмө
эскертүү (билдирүү);
}
showMessage(); // Салам, мен JavaScriptмин!
эскертүү (билдирүү); // <-- ката болот, анткени өзгөрмө функциянын ичинде гана көрүнөт
Тышкы өзгөрмөлөр
Функциянын тышкы өзгөрмөлөргө мүмкүнчүлүгү бар, мисалы:
let userName = 'Вася';
showMessage() функциясы {
let message = 'Салам, ' + userName;
эскертүү (билдирүү);
}
showMessage(); // Салам, Вася
Функциянын тышкы өзгөрмөлөргө толук мүмкүнчүлүгү бар жана алардын маанисин өзгөртө алат.
Мисалы:
let userName = 'Вася';
showMessage() функциясы {
userName = "Питер"; // (1) тышкы өзгөрмөнүн маанисин өзгөртүү
let message = 'Салам, ' + userName;
эскертүү (билдирүү);
}
alert(userName); // Вася функцияны чакырганга чейин
showMessage();
alert(userName); // Петя, тышкы өзгөрмөнүн мааниси функция тарабынан өзгөртүлгөн
Тышкы өзгөрмө функциянын ичинде мындай локалдык өзгөрмө жок болсо гана колдонулат.
Эгерде бир эле аталыштагы өзгөрмө функциянын ичинде жарыя кылынса, анда ал сырткы өзгөрмөсүн жокко чыгарат. Мисалы, төмөндөгү коддо функция userName жергиликтүү өзгөрмөсүн колдонот.Тышкысы эске алынбайт:
let userName = 'Вася';
showMessage() функциясы {
let userName = "Питер"; // жергиликтүү өзгөрмө жарыялоо
let message = 'Салам, ' + userName; // Петр
эскертүү (билдирүү);
}
// функция өзүнүн локалдуу userName өзгөрмөсүн түзүп, колдонот
showMessage();
alert(userName); // Вася, өзгөргөн жок, функция тышкы өзгөрмөгө тийген жок
Глобалдык өзгөрмөлөр
Жогорудагы коддогу тышкы өзгөрмө userName сыяктуу бардык функциялардан тышкары жарыяланган өзгөрмөлөр глобалдык өзгөрмөлөр деп аталат.
Глобалдык өзгөрмөлөр каалаган функцияга көрүнүп турат (эгерде алар бир эле аталыштагы локалдык өзгөрмөлөр тарабынан жокко чыгарылбаса).
Глобалдык өзгөрмөлөрдү колдонууну минималдуу деңгээлде кармоо максатка ылайыктуу. Заманбап код, адатта, бир нече глобалдык өзгөрмөлөргө ээ же такыр жок. Алар кээде маанилүү "долбоор боюнча" маалыматтарды сактоо үчүн пайдалуу болсо да.
Параметрлер
Параметрлер аркылуу функциянын ичиндеги каалаган маалыматты өткөрө алабыз.
Төмөндөгү мисалда функцияга эки параметр өткөрүлүп берилген: from жана text.
function showMessage(from, text) { // параметрлери: from, text
эскертүү (+ ': ' + тексттен);
}
showMessage('Анна', 'Салам!'); // Аня: Салам! (*)
showMessage('Анна', "Кандайсың?"); // Аня: Кандайсың? (**)
Функция (*) жана (**) саптарында чакырылганда, берилген маанилер жана тексттен жергиликтүү өзгөрмөлөргө көчүрүлөт. Андан кийин алар функциянын денесинде колдонулат.
Бул жерде дагы бир мисал: бизде бир өзгөрмө бар жана биз аны функцияга өткөрүп беребиз. Функциянын маанисин өзгөртөөрүн эске алыңыз, бирок бул өзгөртүү сырттан көрүнбөйт.Функция ар дайым маанинин көчүрмөсүн гана алат:
showMessage функциясы (ден, текст) {
from = '*' + from + '*'; // бир аз "ден" кооздоп
alert( from + ': ' + text );
}
let from = "Анна";
showMessage(ден, "Салам"); // *Анна*: Саламатсызбы
// "ден" мааниси ошол бойдон калат, функция локалдык өзгөрмөнүн маанисин өзгөрттү
эскертүү (ден); // Аня
Функцияга параметр катары берилген маани аргумент деп да аталат.
Башкача айтканда:
Параметр – функция декларациясында кашаага алынган өзгөрмө.
Аргумент - бул функция чакырылганда ага берилүүчү маани.
Биз функцияларды параметрлердин тизмеси менен жарыялайбыз, андан кийин аргументтерди өткөрүп, аларды чакырабыз.
Жогорудагы мисалды карап, биз мындай деп айта алабыз: "showMessage функциясы эки параметр менен жарыяланып, андан кийин эки аргумент менен чакырылат: From жана "Hello"".
Демейки маанилер
Эгерде функцияны чакырганда аргумент көрсөтүлбөсө, анда анын мааниси аныкталбаган болуп калат.
Мисалы, жогорудагы showMessage(from, text) функциясын бир аргумент менен чакырса болот:
showMessage("Анна");
Бул катага алып келбейт. Мындай чакыруу "*Анна*: аныкталбаган" басып чыгарат. Чакыруу тексттин параметрин көрсөтпөйт, ошондуктан текст === аныкталбаган деп кабыл алынат.
Эгерде биз тексттин параметрин демейки мааниге коюуну кааласак, аны = кийин көрсөтүшүбүз керек:
showMessage функциясы (ден, text = "текст кошулган жок") {
alert( from + ": " + text );
}
showMessage("Анна"); // Аня: текст кошулган жок
Эми, эгер тексттин параметри көрсөтүлбөсө, анын мааниси "текст кошулган жок"
Бул учурда, "текст кошулбаган" сап болуп саналат, бирок ал параметр жок болгон учурда бааланып, дайындалган татаалыраак туюнтма болушу мүмкүн эле.Мисалы:
function showMessage(ден, текст = anotherFunction()) {
// anotherFunction() эч кандай текст берилбесе гана аткарылат
// натыйжасы тексттин мааниси болот
}
Демейки параметр эсептөө
JavaScript'те демейки параметрлер функция тиешелүү параметрсиз чакырылган сайын бааланат.
Жогорудагы мисалда, текст параметри көрсөтүлсө, anotherFunction() такыр чакырылбайт.
Башка жагынан алганда, функция текст жок болгон сайын өз алдынча чакырылат.
JavaScriptтин алгачкы версияларында демейки параметрлерди колдонуу
JavaScript'тин алгачкы версиялары демейки параметрлерди колдогон эмес. Ошондуктан, эски скрипттерде табууга болот альтернатива жолдору бар.
Мисалы, аныкталбаган үчүн ачык текшерүү:
showMessage функциясы (ден, текст) {
эгерде (текст === аныкталбаган) {
text = 'текст кошулган жок';
}
alert( from + ": " + text );
}
…Же || операторун колдонуп:
showMessage функциясы (ден, текст) {
// Эгерде текст жалган болсо, анда текстти демейки мааниге коюңуз
// эске алыңыз, бул учурда бош сап тексти === "" да жетишпеген маани катары каралат
text = text || 'текст кошулган жок';
...
}
Альтернативдик демейки параметрлер
Кээде параметрлер үчүн демейки маанилерди функциянын декларациясында эмес, кийинки этапта ыйгаруу акылга сыярлык.
Функцияны аткаруу учурунда, биз аны аныкталбаганга салыштырып, параметр өткөнүн текшере алабыз:
ShowMessage функциясы (текст) {
// ...if (текст === undefined) { // эгерде параметр жок болсо
text = 'бос кабар';
}
эскертүү (текст);
}
showMessage(); // бош билдирүү
…Же биз || операторун колдоно алабыз:
ShowMessage функциясы (текст) {
// эгерде текст жалган болсо же аныкталбаганга барабар болсо, анда текстти "бош" кылып коюңуз
text = text || 'бос';
...
}
Заманбап JavaScript кыймылдаткычтары null бириктирүү операторун колдойт ??. 0 сыяктуу жалган маанилердин көбү "нормалдуу" деп эсептелсе, аны колдонуу эң жакшы тажрыйба болмок.
function showCount(count) {
// эгерде эсептөө аныкталбаган же нөл болсо, "белгисиз" көрсөтүлсүн
эскертүү(count ?? "белгисиз");
}
showCount(0); // 0
showCount(null); // белгисиз
showCount(); // белгисиз
Кайтаруу мааниси
Функция аны чакырган кодго бериле турган натыйжаны кайтара алат.
Эң жөнөкөй мисал - эки санды кошуу функциясы:
функциянын суммасы(a, b) {
a + b кайтаруу;
}
натыйжа = сумма(1, 2);
эскертүү (натыйжа); // 3
Кайтаруу директивасы функциянын денесинин каалаган жеринде пайда болушу мүмкүн. Аткаруу ушул чекитке жеткенде, функция токтойт жана маани аны чакырган кодго кайтарылат (жогорудагы натыйжа өзгөрмөсүнө дайындалган).
Бир нече кайра чалуулар болушу мүмкүн, мисалы:
function checkAge(age) {
эгерде (жаш >= 18) {
чындыкты кайтаруу;
} башка {
return confirm('Ата-энең уруксат бердиби?');
}
}
let age = prompt('Сиз канча жаштасыз?', 18);
if ( checkAge(age) ) {
alert ('Кирүү мүмкүнчүлүгү берилди');
} башка {
alert('Кирүү четке кагылды');
}
Маанисиз кайтарууну колдонууга болот. Бул функциянын дароо чыгып кетишине алып келет.Мисалы
showMovie(жаш) {
if ( !checkAge(age) ) {
кайтаруу;
}
alert("Сизге кино көрсөтүлүүдө"); // (*)
// ...
}
Жогорудагы коддо, checkAge(age) жалган деп кайтарса, showMovie эскертүү бербейт.
Бош кайтаруусу бар же жок функциянын натыйжасы аныкталбаган
Эгерде функция маанини кайтарбаса, анда ал аныкталбай кайтарылгандай эле болот:
function doNothing() { /* empty */ }
alert( doNothing() === undefined ); // чын
Бош кайтаруу аныкталбаган кайтаруу менен бирдей:
function doNothing() {
кайтаруу;
}
alert( doNothing() === undefined ); // чын
Эч качан кайтаруу жана анын маанисинин ортосуна жаңы сап кошпоңуз
Анын ордуна узак сөз үчүн, аны бир нече өзүнчө саптарга коюу азгырылышы мүмкүн, мисалы:
кайтуу
(кээ бир + узун + туюнтма + же + кандай болсо да * f(a) + f(b))
Код иштебейт, анткени JavaScript котормочу кайтарылгандан кийин чекиттүү үтүрдү алмаштырат. Ал үчүн бул мындай болот:
кайтаруу;
(кээ бир + узун + туюнтма + же + кандай болсо да * f(a) + f(b))
Ошентип, ал иш жүзүндө бош кайтып келди.
Эгерде биз кайтаруу туюнтмасы бир нече сапты камтысын кааласак, аны кайтаруу менен бир саптан башташыбыз керек. Же, жок эле дегенде, ал жерге ачуу кашааны коюңуз, мисалы:
кайтуу(
кээ бир + узун + билдирүү
+ же +
эмне болсо да * f(a) + f(b)
)
Ошондо баары ойдогудай иштейт.
Функциянын аталышын тандоо
Функция бул иш-аракет. Демек, функциянын аталышы көбүнчө этиш болот. Ал кыска, так жана функция эмне кыларын сүрөттөп бериши керек, ошондуктан кодду окуган программист функция эмне кылганы жөнүндө жакшы түшүнүк алат.Эреже катары, иш-аракеттин жалпы мүнөзүн билдирген сөздүк префикстер колдонулат, андан кийин тактоо. Адатта, иштеп чыгуу топтору бул префикстердин маанилерине байланыштуу конвенцияларга ээ.
Мисалы, "көрсөтүү" менен башталган функциялар адатта бир нерсени көрсөтөт.
… менен башталган функциялар
"ал..." - маанини кайтаруу,
"calc..." - бир нерсени эсептөө,
"түзүү ..." - бир нерсе түзүү,
"текшерүү ..." - бир нерсени текшерип, логикалык маанини кайтарыңыз, ж.б.
Мындай ысымдардын мисалдары:
showMessage(..) // билдирүүнү көрсөтүү
getAge(..) // жашты кайтарат (кандайдыр бир жол менен алуу)
calcSum(..) // сумманы эсептеп, натыйжаны кайтарат
createForm(..) // форманы түзөт (жана көбүнчө бирин кайтарат)
checkPermission(..) // кирүүнү текшерет, чындык/жалганды кайтарат
Префикстердин аркасында функциянын атына биринчи караганда анын коду эмне кылаары жана ал кандай маанини кайтара ала турганы түшүнүктүү болот.
Бир функция - бир иш
Функция анын аты ачык айтылган нерсени гана аткарышы керек. Жана бул бир иш болушу керек.
Эки көз карандысыз иш, адатта, эки функцияны билдирет, атүгүл алар чогуу чакырылса да (бул учурда биз аларды чакыра турган үчүнчү функцияны түзө алабыз).
Бул эрежени бузган бир нече мисалдар:
Эгер функция жашы менен эскертип турган болсо, getAge жаман тандоо болмок (аны кайтарып берүү гана керек).
createForm бул туура эмес тандоо, эгерде функция документти ага форма кошуу менен өзгөртсө (форманы түзүп, аны кайтарып бериши керек).Функция текстке кирүүгө уруксат берилген/башкарылган билдирүүнү көрсөтсө, checkPermission жаман тандоо болмок (текшерүүнү гана аткарып, натыйжаны кайтарышы керек).
Бул мисалдарда префикстердин жалпы кабыл алынган маанилери колдонулган. Албетте, сиз командада башка баалуулуктар боюнча макулдаша аласыз, бирок, адатта, алар жалпы кабыл алынган баалуулуктардан бир аз айырмаланат. Кандай болгон күндө да, сиз жана сиздин команда префикс эмнени билдирерин, функция аны менен эмне кыла аларын жана эмне кыла албастыгын так түшүнүшү керек.
Супер кыска функция аттары
Көбүнчө колдонулган функция аттары кээде өтө кыска болот.
Мисалы, jQuery алкагы $ менен функцияны аныктайт. Лодаш китепканасында негизги функция _ аты менен көрсөтүлөт.
Бул өзгөчө учурлар. Жалпысынан алганда, функция аттары кыска жана сүрөттөмө болушу керек.
Функциялар == Комментарийлер
Функциялар кыска жана бир гана нерсени аткарышы керек. Эгер бул чоң нерсе болсо, функцияны бир нече кичинелерге бөлүү мааниси бар. Кээде бул эрежени сактоо оңой эмес, бирок бул, албетте, жакшы эреже.
Кичинекей функциялар сыноону жана мүчүлүштүктөрдү оңдоону жеңилдетип гана койбостон - мындай функциялардын бар болушу жакшы комментарийлерди берет!
Мисалы, төмөндөгү эки showPrimes(n) функциясын салыштырып көрөлү. Алардын ар бири n чейин жөнөкөй санды чыгарат.
Биринчи параметр nextPrime энбелгисин колдонот:
showPrimes(n) {
nextPrime: for (i = 2; i < n; i++) {
үчүн (j = 2 болсун; j < i; j++) {
if (i % j == 0) nextPrime улантуу;
}
эскертүү(i); // жөнөкөй
}
}
Экинчи параметр праймды текшерүү үчүн кошумча isPrime(n) функциясын колдонот:
showPrimes(n) {
үчүн (i = 2; i < n; i++) {
if (!isPrime(i)) улантуу;
эскертүү(i); // жөнөкөй
}
}
function isPrime(n) {
үчүн (i = 2; i < n; i++) {
if ( n % i == 0) false кайтарса;
}
чындыкты кайтаруу;
}
Экинчи вариантты түшүнүү оңой, туурабы? Коддун ордуна биз аракеттин атын көрөбүз (isPrime). Кээде иштеп чыгуучулар мындай кодду өзүн-өзү документтештирүү деп аташат.
Ошондуктан, биз аларды кайра колдонууну пландабасак да, функцияларды түзүү алгылыктуу. Мындай функциялар кодду түзүшөт жана аны түшүнүктүү кылат.
Бардыгы
Функциянын декларациясы төмөнкүдөй көрүнөт:
функциянын аталышы (параметрлер, үтүр менен бөлүнгөн) {
/* дене, функциянын коду */
}
Өткөрүлгөн маанилер функциянын параметрлерине көчүрүлүп, жергиликтүү өзгөрмөлөргө айланат.
Функциялар тышкы өзгөрмөлөргө жетүү мүмкүнчүлүгүнө ээ. Бирок ал ичинен гана иштейт. Функциядан тышкаркы код анын локалдык өзгөрмөлөрүнө кире албайт.
Функция маанини кайтара алат. Эгер андай болбосо, натыйжа аныкталбайт.
Код тазараак жана түшүнүктүү болушу үчүн, тышкы өзгөрмөлөрдү колдонбостон, локалдык өзгөрмөлөрдү жана функциянын параметрлерин колдонуу сунушталат.Параметрлерди кабыл алып, алар менен иштеген, анан жыйынтыкты кайтарган функция параметрсиз чакырылган, бирок терс таасирлери көп болгон тышкы өзгөрмөлөрдү өзгөрткөн функцияга караганда алда канча түшүнүктүү.
Функциянын аталышы:
Функциянын аталышы анын эмне кылып жатканын так жана так чагылдырышы керек. Коддо анын чакырыгын көрүп, анын эмне кылганын жана эмнени кайтарарын дароо түшүнүшүңүз керек.
Функция иш-аракет, ошондуктан анын аты көбүнчө этиш болот.
Көптөгөн жалпы префикстер бар, мисалы: түзүү…, көрсөтүү…, алуу…, текшерүү… ж.б. Функция эмне кылаарын түшүндүрүү үчүн аларды кеңеш катары колдонуңуз.
Функциялар скрипттердин негизги курулуш материалы болуп саналат. Биз JavaScript'те функциялардын негиздерин гана карадык, бирок эми аларды түзүп, колдоно алабыз. Бул саякаттын башталышы гана. Биз кайра-кайра функцияларга кайрылып, аларды барган сайын тереңирээк изилдейбиз.
Tasks
"Башка" керекпи?
маанилүүлүгү: 4
Жашы 18ден жогору болсо, төмөнкү функция чындыкты кайтарат.
Болбосо, ал ырастоо аркылуу ырастоону талап кылат жана анын жыйынтыгын кайтарат:
function checkAge(age) {
эгерде (жаш > 18) {
чындыкты кайтаруу;
} башка {
// ...
return confirm('Ата-энелерге уруксат барбы?');
}
}
Эгер башка алынып салынса, бул функция башкача иштейби?
function checkAge(age) {
эгерде (жаш > 18) {
чындыкты кайтаруу;
}
// ...
return confirm('Ата-энелерге уруксат барбы?');
}
Бул варианттын жүрүм-турумунда кандайдыр бир айырмачылык барбы?
чечим
Функцияны '?' операторунун жардамы менен кайра жазыңыз же '||'
маанилүүлүгү: 4
Жашы 18ден жогору болсо, төмөнкү функция чындыкты кайтарат.
Болбосо, ал ырастоочу суроону берет жана анын жыйынтыгын берет.function checkAge(age) {
эгерде (жаш > 18) {
чындыкты кайтаруу;
} башка {
return confirm('Ата-энелерге уруксат барбы?');
}
}
Ошол эле нерсени аткаруу үчүн функцияны кайра жазыңыз, бирок бир сапта if белгиси жок.
checkAge функциясынын эки вариантын жасаңыз:
Колдонуу ?
|| операторун колдонуу
чечим
мин(a, b) функциясы
маанилүүлүгү: 1
a жана b сандарынын кичүүсүн кайтаруучу min(a,b) функциясын жазыңыз.
Чакыруу мисалы:
мин(2, 5) == 2
мин(3, -1) == -1
min(1, 1) == 1
чечим
функция pow(x,n)
маанилүүлүгү: 4
xти n даражасына көтөрүүчү жана натыйжаны кайтаруучу pow(x,n) функциясын жазыңыз.
pow(3, 2) = 3 * 3 = 9
pow(3, 3) = 3 * 3 * 3 = 27
pow(1, 100) = 1 * 1 * ...* 1 = 1
x жана n сураган баракты түзүңүз, андан кийин pow(x,n) натыйжасын басып чыгарыңыз.
Демо иштетүү
P.S. Бул маселеде функция n табигый маанилерин гана колдоого алышы керек, б.а. 1ден баштап бүтүн сандар.