JavaScript funktsiyalari. Visual JavaScript: Funktsiyalar Butt JavaScript funktsiyalari

Golovna / 2 Ajoyib o'quvchilar

Operatorlar va vinyatkívni qayta ishlashga o'tish

JavaScript-dagi operatorlarning yana bir toifasi o'tish operatorlaridir. Nomdan tashqari qo'shiq kuylaganingizda, bu operatorlar JavaScript tarjimonini to'xtatib, dastur kodidagi boshqa joyga o'tadi. Break iborasi tarjimonni keyingi ko'rsatma bilan tsiklning oxiriga o'tishni to'xtatadi. Continue operatori tarjimonni tsikl tanasining qoldirilgan qismini o'tkazib yuborish uchun o'zgartiradi, tsiklning yuqori qismiga qaytib, yangi iteratsiyaning oxiriga o'tadi. Da mening JavaScriptê mozhliv_st ínstruktsíї ínstruktsíííí ínstruktsíї ínstruktsiííííí zavdyaki nima uchun operatorlarda í davom í aniq vkazuvati bo'lishi mumkin, qadar kakoi chi ííííííí íííííííí 'li.

Qaytish iborasi tarjimonni looplangan funksiyadan aylanish nuqtasiga qaytib, sikl qiymatini aylantirishga olib keladi. Otish operatori xatolar va topshiriqlarni try/catch/finally iboralari bilan ishlashga olib keladi, shuning uchun ular o'chirishni boshqarish uchun dastur kodiga blok tayinlaydi. O'tishda katlanadigan turli xil operatorlarni qo'shishga arziydi: tarjimon o'chirilganda, bir xil funktsiyaga o'tkazilishi mumkin bo'lgan yoki undan ko'p bo'lgan xatolarni eng yaqin hajmli qayta ishlashga o'ting. keyingi funksiya.

Barcha o'tish operatorlarining hisobotlari keyingi bo'limlarda tasvirlangan.

Ko'rsatmalar yorliqlari

Ko'rsatma oldida identifikator va ikki ko'rsatgich bilan belgilanishi mumkinmi yoki yo'qmi:

identifikator: ko‘rsatma

Muhim ko'rsatmalar, biz sizning ismingizni beramiz, shunda siz keyinchalik dasturning istalgan joyida kuch sifatida g'alaba qozonishingiz mumkin. Siz bu ko'rsatma yoki yo'qligini ko'rsatishingiz mumkin, esda tutingki, u ko'rsatmalardan ko'ra sezgirroq bo'lishi mumkin, tanani qanday qilish kerak, masalan, tsikllar va aqliy ko'rsatmalar.

Uni tsiklga bosgandan so'ng, uni tanaffusda burish va ko'rsatmalarni davom ettirish mumkin, tsiklning o'rtasida yangidan chiqish yoki kob sikli uchun, keyingi iteratsiyaga qadar. Tanaffus qilish va davom ettirish ko'rsatmalari JavaScript tilidagi yagona ko'rsatmalar bo'lib, unda teglar kiritishingiz mumkin - ular haqida keyinroq aytiladi. Quyida belgili va davom ko'rsatmasi bo'lgan while ko'rsatmasi g'olib belgisi kabi ko'rsatilgan:

Mainloop: while (token != null) ( // Oʻchirish kodi... mainloopni davom ettirish; // Belgilangan siklning keyingi iteratsiyasiga oʻtish )

Yo'riqnoma yorlig'i sifatida g'olib bo'lgan identifikator zahiralangan so'zdan tashqari yaroqli JavaScript identifikatori bo'lishi mumkin. Kremldagi teglarning nomlari o'zgartirilgan va funktsiyalar nomlari ko'rinishida, shuning uchun belgilar o'zgartirilgan yoki boshqa funktsiyalar nomlari bilan chetlab o'tilgan identifikatorlarni yutib olishga ruxsat beriladi.

Ko'rsatmalarning belgilari hidlanib qolguncha (va, albatta, ularga kiritilgan ko'rsatmalarning o'rtasida) ko'rsatmalarning o'rtasidan ko'p emas. Kiritilgan ko'rsatmalarni bir xil identifikatorlar bilan aniqlash mumkin emas, lekin ularni o'z ichiga olgan ikkala ko'rsatmalar va ikkita mustaqil ko'rsatmalar bir xil teglar bilan aniqlanishi mumkin. Uchrashuvlar qayta tayinlanishi mumkin. Tobto be-like ko'rsatma shaxssiz belgilarning onasi bo'lishi mumkin.

break bayonoti

Break bayonoti ichki tsikldan yoki switch bayonotidan muzokarasiz chiqishga keltirilishi mumkin. Ilgari biz switch operatorining o'rtasida break operatoridan foydalanardik. Har qanday sababga ko'ra g'alabali tsiklni yakunlash kerak bo'lsa, tsikldan foydasiz chiqish uchun g'olib bo'lgan vinolar davrlarida.

Agar tsikl aqliy jihatdan to'liqroq bo'lishi mumkin bo'lsa, uni sindirish operatori yordamida amalga oshirish osonroq, lekin uni bitta aqliy ifoda siklida bajarish mumkin. Bosqich qo'shiqlari qatorning elementini qo'shiq qiymatlari bilan topishga harakat qilmoqda. Tsikl massivning oxiriga yetgandan so'ng yoki kerakli qiymat topilgandan so'ng, uzilish operatori yordamidan keyin ajoyib tartib bilan tugaydi:

Var arr = ["a", "b", "c", "d", "e"], natija; uchun (var i = 0; i

Move JavaScript-ga break kalit soʻzidan keyin nom tegini qoʻshishga ruxsat beriladi (ikki qoʻshtirnoqsiz identifikator):

label_name;

Agar break iborasi yorliq bilan bajarilmasa, u nomlangan ko'rsatmaning oxiriga o'tmaydi, aks holda u muvaffaqiyatsiz bo'ladi. Belgilangan belgidan ko'rsatma kunining turli vaqtlarida, sintaktik afv hosil qilish uchun sintaktik uzilish operatorining bunday shaklini engish uchun test. Ko'rsatma loop yoki switch operatori sifatida nomlanadi. Yorliqli break iborasi uni o'z ichiga olgan har qanday ko'rsatmalar bilan "buzish" ni belgilashi mumkin. Salqin ko'rsatmalardan foydalanish mumkin oddiy blokínstruktsyy, keling, uni yoga eslab qolish usuli bilan jingalak kamonlarga qo'yaylik.

Kalit so'z break va belgi nomi o'rtasida qator siljishida belgi qo'yish mumkin emas. O'ng tomonda JavaScript tarjimoni etishmayotgan nuqtalarni avtomatik ravishda koma bilan kiritadi: kalit so'zning uzilishi va undan keyingi belgi o'rtasida dastur kodining qatorini buzing, tarjimonga ruxsat bering, chunki bu operatorning tegsiz oddiy shakli kichik, va koma bilan dog'ni qo'shing.

Yorliqli break bayonoti faqat eng yaqin tsikl emas, balki switch operatori bo'lgan ko'rsatmani to'xtatish zarur bo'lganda kerak bo'ladi.

bayonotni davom ettirish

Continue iborasi break operatoriga o'xshaydi. Biroq, tsikldan chiqqandan so'ng, davom iborasi tsiklning yangi iteratsiyasini boshlaydi. Continue iborasining sintaksisi break gapning sintaksisi kabi oddiy. Davom etish iborasi ham belgilanishi mumkin.

Davom etish operatori, xuddi yorliqsiz shakldagi kabi, yorliq bilan faqat bir xil tsiklda g'alaba qozonishi mumkin. Vikoristannya yogo ba'zi boshqa joylarda sintaktik kechirishga olib keladi. Davom etish iborasi sikllanganda, tsiklning tishli takrorlanishi biriktiriladi va kela boshlaydi. Uchun turli xil turlari tsiklív tse razne degan ma'noni anglatadi:

    while siklida siklning kobidagi bayonotlar qayta tekshiriladi va bu to'g'riroq bo'lgani uchun sikl tanasi g'alaba qozonadi.

    Do/while tsikli tsiklning oxiriga o'tishga ega va tsikl takrorlanishidan oldin, ong qayta tekshiriladi.

    For tsiklida keyingi iteratsiya qachon hisoblanishini aniqlash uchun o'sish necha marta va qayta tekshirish necha marta sanaladi.

    For/in siklida sikl tayinlangan o'zgartirish nomini ilgari suruvchi quvvatga tayinlashdan boshlab yangidan boshlanadi.

while va for sikllarida davom operatorining xatti-harakatlarining ko'rinishiga e'tibor bering. while tsikli sizning fikringiz uchun to'xtovsiz aylanadi va for tsikli asta-sekin orqaga qarab hisoblanadi va keyin fikringizga aylanadi. Bosqichma-bosqich ilova egizak raqamlar uchun tishli iteratsiya tsiklidan chiqish uchun yorliqsiz davom etish operatorining davomini ko'rsatadi:

var sum = 0; // (var i = 0; i) uchun 0 - 10 kabi juftlangan raqamlar yig'indisini hisoblang

Continue operatori, masalan, break, yorliqni o'z ichiga olgan shaklda ichki o'rnatilgan sikllarga yopishtirilishi mumkin, so'ngra qayta ishga tushirilgan tsiklda davom etish bayonotisiz o'tkazib yuborilishi uchun tsikl bo'lishi kerak bo'ladi. uzilish. Bundan tashqari, tanaffusga kelsak, davom kalit so'zi orasidagi qatorlarni siljiting va teglarga ruxsat berilmaydi.

qaytarish bayonoti

Viklik funktsiyasi virase va barcha virase qiymatlariga o'xshaydi. Funktsiya o'rtasida joylashgan return iborasi funktsiya tomonidan aylantirilgan qiymatning maqsadi bo'lib xizmat qiladi. Xuddi shu funktsiya uchun qaytarish bayonoti o'tkazib yuborilishi mumkin. Boshqa har qanday dunyoda yoga mavjudligi sintaktik kechirimdir. Qaytish bayonoti bosilganda, funktsiya qiymatni o'zi chaqirayotgan dasturga aylantiradi. Masalan:

Xuddi shunday, tarjimon funktsiya tanasidagi ko'rsatmalarni birin-ketin, funktsiyaning oxirigacha chaqirib, so'ngra uni chaqirish uchun dasturni aylantirganda, funktsiyada qaytish bayonoti mavjud emas. Tsomu vipadku viraz vikliku burilishida qiymat aniqlanmagan. Qaytish bayonoti ko'pincha ê qolgan ko'rsatmalar funktsiyada, lekin uni til deb atashning hojati yo'q: dastur qo'ng'iroq qilganda funktsiya aylanadi, qaytish operatoriga etib borishi bilanoq, undan keyin funktsiya sarlavhasida boshqa ko'rsatmalar bo'lishi kerak.

Qaytish operatori aylanmasiz ham qaytarilishi mumkin, aks holda u shunchaki teskari funksiya ustida takrorlanadi va dasturning aniqlanmagan qiymatining qiymatini aylantiradi. Masalan:

Funktsiya myFun(arr) ( // Raqamlar bo'ylab qidirish uchun massiv sifatida, (var i = 0; i) uchun funksiyani to'xtating.

bayonot tashlash

Vinyatok- bu vinnyatkovo vaziyatni oqlashni yoki kechirishni ko'rsatadigan signaldir. O'chirish o'chirilgan (tashlash)- bunday kechirim yoki aybdor vaziyat haqida signal berishning yo'li. Perekhopiti vinyatok (tutish) - yogo, tobto ham egallaydi. yopilgandan keyin yangilash uchun zarur yoki mos yozuvlarni qabul qiling.

JavaScript-da ayblash istisnolardan kelib chiqadi, agar bu qoidabuzarlik soati uchun kechirim bo'lsa va agar dastur uni otish operatori yordamida aniq chaqirsa. Vinyatki keyinroq tasvirlangan try/catch/finally iboralari bilan yordam so'raydi.

Throw iborasi quyidagi sintaksisga ega bo'lishi mumkin:

virazni tashlash;

Virazu natijasi, qaysi turdagi bo'lishidan qat'i nazar, sezilarli bo'lishi mumkin. Otish operatoriga afv etish to'g'risidagi bildirishnoma matnini o'chirib tashlaydigan afv kodini yoki qatorni bildiruvchi raqam berilishi mumkin. JavaScript tarjimoni xato yogo pastki sinflaridan biri va siz bunday pidkhidni yutib olishingiz mumkin. Ob'ekt xatosi kuchga ega nomi, bu afv turini, bu kuchni bildiradi xabar, qatordan qasos olish uchun, konstruktor funktsiyasiga o'tkaziladi ob'ekt xatosi píd hour viklik z nojoiz dalil:

// Raqam funksiyasining faktorial (raqam) ( // Agar kiritilgan argument haqiqiy qiymat bo'lmasa, // uni ayblaymiz! if (1-raqam; i *= raqam, raqam--); /* bo'sh tsikl tanasi */ return i ; ) konsol. log("5! = ", faktorial(5)); konsol. log("-3! = ", faktorial(-3));

Agar vinyetkalar mavjud bo'lsa, JavaScript tarjimoni dasturning eng yaqin vinyatki kompilyatoriga oddiy rivojlanishini tasodifiy to'xtatadi. catch bandlarida try/catch/finally konstruksiyasining catch iborasi mavjud bo‘lib, uning tavsifi hujum bo‘limida berilgan.

Dastur kodining bloki sifatida, unda ayblash mumkin emas, ushlash konstruktsiyasi yo'q, tarjimon dastur kodining joriy blokini tahlil qiladi va unga aybdor nima mos kelishini qayta tekshiradi. Tse trivaê doti, doki obrobnik topilmaydi.

Bu qayta ishlash uchun tan olingan try/catch/nihoyat konstruksiyalari uchun qasos olmaslik uchun ayblash funksiyalari yaratilsa, ayblash funksiyani chaqiruvchi dastur kodi yanada kengaytiriladi. Bunday martabada leksik tuzilmaning orqasida vinyat kengayib boradi JavaScript usullari qo'ng'iroqlar to'plamida tepaga. Ilm yo'qdek, uzumlarga afvdek qarashadi, koristuvachlar yarashishadi.

urinib ko'ring/qo'lga oling/nihoyat qurish

try/catch/finally construct JavaScript-da vinyetkalarni qayta ishlash mexanizmini amalga oshiradi. bayonotni sinab ko'ring ushbu dizayn uchun siz shunchaki kodga blokni tayinlaysiz, unda aybdor. Sinab ko'rish blokiga rioya qiling catch bayonoti deb chaqiriladi ko'rsatmalar bloki bilan, go'yo bir necha marta bor edi blok harakat aybdor g'alaba. catch bayonotidan keyin blok keladi nihoyat sinash blokiga kiritilganidan mustaqil ravishda yengish kafolatlangan yakuniy operatsiyalarda g'olib bo'lgan dastur kodidan qasos olish.

I catch bloki, va finally bloki majburiy emas, lekin try blokidan keyin ulardan biri aybdor. Sinab ko'ring, tuting va nihoyat bloklar jingalak kamar bilan boshlanadi va tugaydi. Tse obov'yazkova sintaksisning bir qismi va o'tkazib yuborilmaydi, lekin ular orasida faqat bitta ko'rsatma o'tkazilishi mumkin.

Keyingi parcha o'sha try/catch/finally construct sintaksisini ko'rsatadi:

Sinab ko'ring (// Ushbu kodni boshidan oxirigacha muammosiz ishga tushiring. // Lekin bir nuqtada kimdir aybdor bo'lishi mumkin // yoki otish operatori yordamisiz, yoki - // qo'ng'iroq qiling aybni keltirib chiqaradigan usul.) catch (sobiq) ( // Ushbu blokdagi ko'rsatmalar faqat try blokida // ayblovni ayblasagina tekshiriladi. // Bu blok qandaydir ayblashi mumkin yoki // buni e'tiborsiz qoldirishi mumkin. , keyinroq rouming yoki qayta yaratish // otish operatorining yordami uchun ayblash.) // try blokida nima sodir bo'ldi. U xato qiladi, chunki try bloki tugadi: // 1) qanday ovoz berish kerak, yetib borgan. blokning oxiri // 2) break iborasi orqali davom eting yoki qaytaring // 3) ayblov bilan biz uni catch blokida to'ldiramiz ko'proq // 4) o'z // yanada yuqori rívny kengaytirish)

E'tibor bering, catch kalit so'zidan keyin qo'llarda identifikator keladi. Bu identifikator funksiya parametrini taxmin qiladi. Agar nishon ustiga yozilgan bo'lsa, bu parametrga nishon beriladi (masalan, Xato obyekti). Boshqa tomondan, catch operatori bilan bog'langan o'zgaruvchi identifikatori faqat catch blokida ishlatiladi.

Keyinchalik, try/catch dizaynining real ko'rinishi ko'rsatilgan. Yangisi faktorial() usulini, oldingi ilovadagi qiymatlarni, kiritish va ko'rsatishni tashkil qilish uchun JavaScript mijozining prompt() va alert() usullarini chaqiradi:

Sinab ko'ring ( // Muxbirdan raqam so'rash var n = Raqam(prompt("Ijobiy raqam kiriting", "")); // Kiritilgan ma'lumotlar to'g'ri deb faraz qilib, raqamning faktorialini hisoblang var f = factorial(n); // Natija ogohlantirishini kiriting (n + "! = " + f); ) catch (ex) ( // Agar ma'lumotlar noto'g'ri bo'lsa, boshqaruv bu yerga o'tkaziladi alert(ex); // Ayting kechirim haqida koristuvach)

Koristuvach berilgan raqamni kiritgan zahoti men bildirishnoma oldiga chiqishim kerak:

Bu finally ifodasisiz try/catch konstruktsiyasiga misol. Nihoyat, qo'lga qaraganda kamroq tez-tez g'alaba qozonsa-da, proteo boshqa operator juda qiyin ko'rinadi. Finally bloki, try blokidagi dastur kodi qanday tartibda tugaganidan qat'i nazar, u try blokining bir qismi bo'lsa ham, o'ralgan bo'lishi kafolatlanadi. Tsya mozhlivistvo zazvychay vikoristovuetsya vykonannya dasturi kodi protya harakat keyin vykonannya yakuniy operatsiyalari uchun.

Dastlabki vaziyatda sinash blokining oxiriga etib borish kerak, so'ngra kerakli yakuniy operatsiyalarni bajaradigan finally blokiga o'tish kerak. Qaytish, davom ettirish yoki break iboralari natijasida boshqaruv elementi try blokidan chiqib ketgan bo'lsa, finally bloki boshqaruvni o'tkazishdan oldin halqalanadi.

Sinab ko'rish blokida aybdorlar borligi va birinchi ishlov berish uchun alohida tutqich bloki mavjud bo'lganligi sababli, kalit catch blokiga, so'ngra yakuniy blokga o'tkaziladi. Go'yo joriy mahalliy ushlash bloki, keyin o'rash final blokiga o'tkaziladi va keyin biz eng yaqin tashqi tutqich blokiga o'tamiz, uni ayblash mumkin.

Go'yo finally blokining o'zi qo'shimcha bayonotlarni qaytarish, davom ettirish, sindirish yoki tashlash yoki ayblovni keltirib chiqaradigan usulga qo'ng'iroq qilish yo'lini tekshirishdan o'tayotgandek, chekni o'tkazish buyrug'i bajarilmaydi va keyin yana chaqiriladi. . Misol uchun, agar nihoyat blok vinyetkalarni hosil qilsa, bu vinyatok vinyaty avlodidan oldin almashtirilishi kerak.

Odamlar kompyuter fanlari daholar san'ati ekanligini vvazhayut. Hammasi to'g'ri, shunchaki, nutqlarni chetlab o'tish uchun juda ko'p odamlar bor, masalan, bitta ustida yolg'iz turish, nibi kichik kaminchikiv devorini yig'ish kabi.

Donald Batig

Alert kabi funksiyalar uchun sizda allaqachon wiki mavjud. Funktsiyalar JavaScript dasturlashning noni va sariyog'idir. Dasturiy ta'minotning bir qismini o'rash va haftalik o'zgartirish kabi g'oya allaqachon so'ralgan. Bu ajoyib dasturlarni tuzish, takrorlashni o'zgartirish, dastur nomlarini tanib olish va dasturni bittadan ajratish uchun vositadir.

Funktsiyalarning eng aniq tanlovi lug'at yaratishdir. Buyuk inson nasri uchun vigaduvati so'zlari - iflos ohang. Kino dasturlash kerak.

O'rtacha rus xalqi o'sib ulg'aygan, ular 10 000 ga yaqin so'zlarni bilishadi. Rídkísna mova progruvannya mysti 10000 vbudovanih buyruqlar. I lug'at movi tayinlash dasturlash ko'proq o'qilishi, kamroq gnuchky, past inson. Shunday ekan, keling, zayvih takroridan xalos bo‘lishimiz uchun yangi so‘zimizga qo‘shish uchun qo‘ng‘iroq qilaylik.

Belgilangan funktsiyalar

Funksiyani tayinlash - zvichayne zminnoy zminnoy, de znachennya, otrimu zminna, ê funktíêyu sifatida. Masalan, keyingi kod kvadratni o'zgartiradi, shuning uchun u funktsiyadan foydalanishga harakat qiladi, shuning uchun u berilgan raqamning kvadratini oladi:

var square = function(x) ( return x * x; ); console.log(kvadrat(12)); // → 144

Funktsiya funktsiya kalit so'zi bilan boshlanadigan til tomonidan yaratilgan. Funktsiyalar parametrlarni o'rnatishi mumkin (uchun ushbu maxsus turga, faqat x), va tana, ko'rsatmalarni qasos olish uchun, chunki u funktsiya haftasining soatini vikonate qilish kerak. Funktsiyaning tanasi har doim jingalak ibodatxonalarga yotqiziladi va u bitta ko'rsatma bilan yig'iladi.

Funktsiya bir nechta parametrlarning onasi bo'lishi mumkin, aks holda ular hisobga olinmasligi kerak. Haqoratli makeNoise ilovasida parametrlar ro'yxati yo'q, lekin quvvat ikkitaga ega:

var makeNoise = function() ( console.log("Virdala!"); ); makeNoise(); // → Axlat! var power = funktsiya (asosiy, ko'rsatkich) ( var natija = 1; uchun (var soni = 0; hisoblash)< exponent; count++) result *= base; return result; }; console.log(power(2, 10)); // → 1024

Ba'zi funksiyalar quvvat va kvadrat kabi qiymatlarni aylantiradi, aks holda makeNoise kabi aylanmaydi, ko'proq yon ta'sirlar qilish kabi. Qaytish bayonoti funktsiya aylanayotganda qiymat oladi. Agar dasturni qayta ishlash ko'rsatmalarga etib borsa, u darhol funktsiyadan chiqib ketadi va kod maydonidagi qiymatni aylantiradi, bula viklikana funktsiyasi yulduzlari. qiymatni aniqlanmagan holda qaytaring.

Parametrlar va qamrov

Funktsiya parametrlari ham o'zgartiriladi, lekin boshlang'ich qiymatlar funksiya chaqirilganda o'rnatiladi, lekin kodda emas.

Funktsiyaning o'rtasida (shu jumladan parametrlar bilan), funktsiyaning o'rtasida lokal ravishda o'zgartiradigan, yaratadiganlar uchun funktsiyalarning kuchi muhimdir. Tse, kuchni qo'llash natijani o'zgartiradi, degan ma'noni anglatadi, bu funktsiyaning keyingi soati uchun har soatda yaratiladi va tsí okremi íí ínkarnatsíí bir xil daraja bir-biri bilan ko'rinmaydi.

O'zgaruvchan funktsiyalarning mahalliyligi parametrlardan kamroq va o'zgaruvchan funktsiyalarning o'rtasini yaratish. O'zgarishlar, qo'ng'iroqning vazifalari, ular funktsiyalar bo'ladimi, global deyiladi, dastur orqali ishga tushirish orqali hid parchalarini ko'rish mumkin. Funktsiyaning o'rtasida ham bunday o'zgarishlarga kirishni rad etish mumkin, chunki ular ushbu nomlarning o'zlari uchun mahalliy o'zgartirish uchun ovoz berishmagan.

Keyingi kod illyustrativdir. Vín vyznaê deb viklikaê ikki funksiyasi, yaki o'zgartirish x qiymatini beradi. Birinchi kar bo'lib, go'yo mahalliy, bir vaqtning o'zida mahalliy o'zgarishlarni o'zgartiradi. Men boshqa aldamayman, funksiyasi o'rtasida robot s x global o'zgarish x qadar olib, deb, cob dumba o'rnatilgan.

var x = "tashqi"; var f1 = function() ( var x = "f1 ichida"; ); f1(); konsol jurnali (x); // → tashqarida var f2 = function() ( x = "f2 ichida"; ); f2(); konsol jurnali (x); // → f2 ichida

Bunday xatti-harakatlar funktsiyalar orasidagi o'zaro bog'liqlikning tushkunligini oldini olishga yordam beradi. Yakbi, barcha o'zgarishlar dasturning istalgan joyida g'alaba qozondi, qayta ko'rib chiqish juda muhim bo'lar edi, bir o'zgarish turli xil e'tiroflar uchun g'alaba qozonmaydi. Va yakbees vikoristovuvali zminnu yana, ajoyib effektlar bilan zatknulis, uchinchi tomon kodi sizning zminnoy qiymati bo'lsa. O'zgartirish funktsiyalari uchun mahalliy narsalarga suyangan holda, hid faqat funktsiyaning o'rtasida topiladi, ishlay olamiz funktsiyalari va kichik sayyoralar bilan, bu butun kod haqida tashvishlanmaslik imkonini beradi.

Skopni joylashtirish

JavaScript nafaqat global miqyosda, balki mahalliy darajada ham farqlanadi. Funktsiyalar funksiyalar o'rtasiga kiritilishi mumkin, ularni iloji boricha ko'proq joylarga qisqartirish mumkin.

Masalan, yana ikkitasining o'rtasida qasos olish funktsiyasining ahmoqligini tugatish vaqti keldi:

var landshaft = function() ( var natija = ""; var flat = funktsiya(hajmi) ( uchun (var count = 0; count)< size; count++) result += "_"; }; var mountain = function(size) { result += "/"; for (var count = 0; count < size; count++) result += """; result += "\\"; }; flat(3); mountain(4); flat(6); mountain(1); flat(1); return result; }; console.log(landscape()); // → ___/""""\______/"\_

Natijani o'zgartirish uchun yassi va tog 'funktsiyalari, shuning uchun badbo'y funktsiyaning o'rtasida bo'ladi, unda u tayinlanadi. Ale hidi hisobni birma-bir o'zgartira olmaydi, chunki bitta funktsiyaning o'zgarishi ko'rish chegaralari orqasida joylashgan. Va landshaft funktsiyalari chaqiruvini keskinlashtirish, funktsiyaning o'rtasi o'zgarishidan bir xil bo'lmaydi.

Tashqi ko'rinishi qisqaroq, terining mahalliy ko'rinishida siz qasos olishingiz mumkin bo'lgan barcha joylarga tegishingiz mumkin. O'zgaruvchan, mavjud o'rta funktsiyalar to'plami funktsiya dasturda tasvirlangan vaqt bilan belgilanadi. Belgilangan funktsiyalarni bajaradigan bloklardagi barcha o'zgarishlar aniq - shu jumladan asosiy dasturda yuqori darajada ko'rsatilganlar. Skoplargacha bo'lgan Cey pídhíd leksik deb ataladi.

Dasturlash haqida ko'proq ma'lumotga ega bo'lgan odamlar, jingalak kamarda qandaydir bloklar, bog'lanishlar mavjud deb o'ylashlari mumkin, ular o'zlarining mahalliy o'tkirligini yaratadilar. Ammo JavaScript-da qamrov faqat funktsiyadir. Siz okremí bloklarini burishingiz mumkin:

Var deaky = 1; (var bir narsa = 2; // Biror narsani o'zgartirish bilan ishlash...)

Blokning o'rtasida Ale deyaki - xuddi shunday o'zgartirilgan, nomi nima. Agar siz bunday bloklar va ruxsatlarni xohlasangiz, ularni faqat if buyrug'i va tsikllari uchun tanlashingiz mumkin.

Sizga g'alati tuyulgan narsa - bu nafaqat siz uchun. JavaScript-ning 1.7 versiyasi mavjud kalit so'z Let, var kabi ishlash kabi, lekin o'zgarishlar qilish, faqat bir funktsiyaga emas, balki blok uchun mahalliy.

Qadriyatlar sifatida ishlaydi

Funktsiyalarning nomlari kichik dastur uchun nomlar kabi eshitiladi. Bunday o'zgarish bir marta o'rnatiladi va o'zgarmaydi. Shuning uchun bu im'ya funktsiyasini chalkashtirib yuborish oson.

Ale tse ikki xil nutq. Viklik funktsiyalarini oddiy o'zgartirish kabi burish mumkin - masalan, har qanday turdagi virazda twisted í̈x. Haftalik funktsiyani yangi o'zgarishda saqlash, uni boshqa funktsiyaga parametr sifatida o'tkazish mumkin. Bundan tashqari, funktsiya siklini saqlaydigan o'zgartirish, normal o'zgarish va uning qiymatini o'zgartirish mumkin:

Var launchMissiles = funktsiya(qiymat) (missileSystem.launch("ple!"); ); agar (safeMode) launchMissiles = funktsiya (qiymat) (/* vídbyy */);

Biz 5 ta mo''jizaviy nutqni muhokama qildik, qanday qilib ishlashingiz mumkin, funktsiyalarning chaqiruvlarini boshqa funktsiyalarga o'tkazish.

Ovoz funksiyalari

Qisqa versiya "var kvadrat = funktsiya ...". Funksiya kalit so'zini ko'rsatma bo'ylab buzish mumkin:

kvadrat(x) funksiyasi (qaytish x * x; )

Ovozsiz funksiyalarning maqsadi. Ko'rsatma kvadratni berilgan funktsiyaga o'zgartirishdir. Hozircha hamma narsa bl. Bunday odam uchun faqat bitta suv tosh bor.

Console.log("Kelajak aytadi:", kelajak()); function future() ( "Bizda hali ham uchadigan mashinalar yo'q."; ) qaytaring.

Bu kod ishlaydi, garchi funktsiya o'sha kod uchun quyida aytilgan bo'lsa-da, bu eng yaxshisidir. Tse vydbuvaetsya ovozli vazifalari hayvon pastga ajoyib dasturining bir qismi ekanligiga. Xushbo'y hid hozirgi ko'rinish maydoniga "ko'chib o'tadi" va uni ushbu hududdagi istalgan kodda chaqirish mumkin. Ba'zan bu qulay, shuning uchun siz kodni shunday tartibda yozishingiz mumkin, bu eng tushunarli bo'lib tuyuladi, bu joydan tashqaridagi barcha funktsiyalarni tanlash kerakligi haqida tashvishlanmasdan, vikoristovuyutsya hidlanadi.

Va agar biz aqlli blok yoki tsikl ichida ovozsiz funksiyadan foydalansak nima bo'ladi? Siz juda ko'p ishlashingiz shart emas. Tarixiy jihatdan, JavaScript-ni ishga tushirish uchun turli platformalar bu kabi ishlarni boshqacha qilgan, ammo filmning hozirgi standarti bu kabi ishlashni to'xtatgan. Agar siz dasturlaringiz ketma-ket ishlashini istasangiz, asosiy dasturning boshqa funktsiyalari o'rtasida joylashgan yalang'och funktsiyalarni tanlang.

Funktsiya misoli() ( funksiya a() () // Normule if (bir narsa) ( funksiya b() () // Ay-yy-yy! ) )

Wiki to'plami
Keling, vikonanny tartibining funktsiyalar bilan qanday ishlashini batafsil ko'rib chiqaylik. Eksa oddiy dastur kilkom viklikami funktsiyalari bilan:

Funksiya greet(who) ( console.log("Salom, "+ who); ) salomlash("Semyon"); console.log("Chetlash");

Bu shunday ishlaydi: zmushu stribnutni ko'pik funktsiyasida salomlash. Boshqarishni bekor qilish, o'ngingizni o'g'irlash va boshqaruvni burish uchun sizdan console.log funksiyasiga qo'ng'iroq qilishingiz so'raladi. Keling, salomlashishning oxiriga yetaylik va oygacha aylanaylik, yulduzlar chaqirdi. Keyingi qatorda console.log ni qayta bosing.

Sxematik ravishda uni quyidagicha ko'rsatish mumkin:

Yuqori salomlashma console.log yuqoriga salomlash

Oskílki funksiyasi joyida burilishda aybdor, yulduzlar chaqirmoqda, kompyuter kontekstni eslab qolishda aybdor, buning uchun bula viklikana ishlaydi. Bir ko'rinishda console.log salomlashish uchun orqaga qaytishi mumkin. Aks holda, u dasturning oxiriga aylanadi.

Dekompyuter kontekstni eslab turadigan joy stek deb ataladi. Har safar funktsiya chaqirilganda, ip konteksti stekning yuqori qismiga joylashtiriladi. Funktsiya aylantirilganda, u ishni davom ettirishi uchun stekdan yuqori kontekstni oladi.

Stackni saqlash xotiraga yordam beradi. Agar stek juda ko'p o'ssa, kompyuter sakrab chiqadi va stekning to'lib ketishi yoki juda ko'p rekursiyani ko'radi. Keyingi kod ko'rsatib turibdi - kompyuterni ikki funktsiya o'rtasida cheksiz qatorlarga olib kelishi uchun ko'proq buklangan quvvatga qo'yish. Aniqrog'i, son-sanoqsiz sartaroshlar, yakbi kompyuteri bitmas-tuganmas stack bo'lardi. Haqiqatan ham, stek qayta yozilmoqda.

tovuq() funksiyasi ( tuxumni qaytarish(); ) funktsiyasi tuxum() ( tovuqni qaytarish(); ) console.log(chicken() + "birinchi keldi."); // → ??

Nebov'yazkoví dalillari
Ruxsatlar sonining keyingi kodini muammosiz tekshirish mumkin:

Ogohlantirish("Salom", "Xayrli kech", "Hammaga salom!");

Rasmiy ravishda, funktsiya bitta argumentni oladi. Biroq, bunday vikliku uchun qasam ichmaydi. Von argumentlarning javobini e'tiborsiz qoldirib, "Salom"ni ko'rsatadi.

JavaScript funksiyalarga uzatiladigan argumentlar miqdoriga ham sodiqdir. Agar siz juda ko'p yuborsangiz, yozuvlar e'tiborga olinmaydi. Juda oz - aniqlanmagan qiymati keyingi kun sifatida tan olinadi.

Ushbu yondashuvning minus tomoni shundaki, funktsiyaga argumentlarning noto'g'ri sonini o'tkazish mumkin va siz hech narsadan uyalmaysiz.

Bundan tashqari, siz neobov'yazykoví argumentlarni olish kabi funktsiyalarni yaratishingiz mumkin. Masalan, quvvat funksiyasining yangi versiyasida ikkita kabi chaqirish mumkin, shuning uchun bitta argument bilan, - qolgan hollarda ko'rsatkich ikkita bilan qimmatroq va funktsiya kvadrat kabi ishlaydi.

Funksiya quvvati(asos, koʻrsatkich) ( agar (koʻrsatkich == aniqlanmagan) koʻrsatkich = 2; var natija = 1; uchun (var count = 0; count)< exponent; count++) result *= base; return result; } console.log(power(4)); // → 16 console.log(power(4, 3)); // → 64

Hujumkor bo'linish uchun bu oson, chunki ma'lum bir funktsiyaga kelsak, siz uzatilgan argumentlarning aniq sonini taniy olasiz. Tse Korisno, tk. bir qancha argumentlarni qabul qilgandek funksiya yaratish imkonini beradi. Masalan, quvvatni sinab ko'rish va unga uzatilgan argumentlarni ko'rsatish uchun console.log:

Console.log("R", 2, "D", 2); // → R 2 D 2

Zamikannya

Bu haqiqat bilan bir vaqtning o'zida o'zgarish sifatida g'alabali funktsiya ko'chadan imkoniyati, mahalliy o'zgarishlar funksiyasi chaqirilganda yangidan yaratiladi, deb, bir tsikl feed uni olib. Funktsiya ishlashni to'xtatsa, mahalliy o'zgarishlar bilan nima qilish kerak?

Hujumkor dumba ovqatni tasvirlaydi. Yangi wrapValue funksiyasi kar bo'lyapti, chunki men mahalliy o'zgarishlarni yaratyapman. Keling, funktsiyani aylantiramiz, shunda biz mahalliy o'zgarishlarni o'qiymiz va bu qiymatni aylantiramiz.

Function wrapValue(n) ( var localVariable = n; return function() ( return localVariable; ); ) var wrap1 = wrapValue(1); var wrap2 = wrapValue(2); konsol jurnali (wrap1()); // → 1 console.log(wrap2()); // → 2

Tse joiz va pratsyuê shunday, qanday qilib siz buti mumkin - o'zgartirish kirish rad etiladi. Bundan tashqari, bir vaqtning o'zida ular bir xil o'zgarishlarning bir nechta nusxalarini olishlari mumkin, bu esa mahalliy o'zgarishlarning funktsiyalari teri tsikli bilan o'zgarishini yana bir bor tasdiqlaydi.

Mahalliy o'zgarishlarning har qanday misoli yordamida mashq qilish qobiliyati zamikannyam deb ataladi. Mahalliy o'zgarishlarni muzlatish funktsiyasi muzlatish deb ataladi. Bu sizni o'zgarishlarning hayot soati bilan bog'liq bo'lgan turbotlarga o'xshatib qo'ymaydi, lekin bu sizga funktsiyalarni ijodiy ravishda yutish imkonini beradi.

Kichkina o'zgarish bilan biz misolimizni raqamlarni berilgan raqamga ko'paytirish kabi funktsiyaga aylantiramiz.

Funksiya multiplikatori(faktor) ( qaytaruvchi funksiya(raqam) ( qaytaruvchi raqam * omil; ); ) var two = multiplikator(2); console.log(ikki marta(5)); // → 10

Okrema localVariable kshtaltga o'zgartirildi, chunki wrapValue endi kerak emas. Oskylki parametri - o'z-o'zidan mahalliy o'zgarish.

Shunga o'xshash darajada o'ylashni boshlash uchun amaliyot kerak. Yaxshi variant Manifest modellari - funksiya kodni o'z uslubida muzlatishini va uni paketga o'rashini ko'rsatadi. Agar siz qaytish funksiyasini(...) (...) ishlatayotgan bo'lsangiz, masofadan boshqarish pulti kodni buzish yoki yo'qligini aniqlay olasiz, keyinroq ishlash uchun uni muzlatib qo'yamiz.

Bizning ko'paytirgichimizda biz qismlarni muzlatish kodiga aylantiramiz, biz o'zgartirishdan ikki marta olamiz. Qolgan qator o'zgartirilishi kerak bo'lgan funktsiyani chaqiradi, shuning uchun jamg'arma kodi faollashtirilgan (qaytish raqami * omil;). Yangisi hali ham o'zgartirish koeffitsientiga kirish huquqiga ega, chunki u dastlab multiplikator chaqirilganda, raqamli parametr sifatida unfreeze soatiga (5) o'tgan argumentga kirishdan oldin qilingan.

rekursiya

Funktsiya bir butun sifatida o'zini chaqirishi mumkin, shuning uchun stekni qayta to'ldirmasangiz, bu muhim emas. Bunday funktsiya rekursiv deyiladi. Oyoqlarda bog'lanishni muqobil amalga oshirishning dumba o'qi:

Funktsiya kuchi(asosiy, ko'rsatkich) ( agar (ko'rsatkich == 0) 1ni qaytaradi; aks holda bazani qaytaradi * quvvat(tayanch, ko'rsatkich - 1); ) console.log(power(2, 3)); // → 8

Taxminan shunday qilib, matematiklar oyoq ostidagi qadamlarni belgilaydilar va, ehtimol, kontseptsiyani yanada oqlangan, pastki tsiklni tasvirlaydilar. Funktsiya bagator marta multiplikatoriga erishish uchun turli argumentlardan ko'p marta chaqiradi.

Biroq, bu dasturda muammo bor - ajoyib o'rta JavaScript 10 baravar yaxshiroq, pastroq versiya tsiklli. Arzonroq chiqish uchun tsiklni o'tkazing, funktsiyaning aylanishini pasaytiring.

Cicavani tugatish uchun "nafislikka qarshi shirinlik" dilemmasi. Є odamlar uchun promizhok mizh zruchnistyu va mashina uchun zruchnistyu kuylash. Qani endi dasturni tezlashtirsa, ko'proq va dono bo'lsa. Dasturchi balansni bilishi kerak.

Oyoqlarga birinchi bo'g'inning uchida inelegant tsikl oddiy va aql-idrokdir. Yoga rekursiyasini almashtirishning ma'nosi yo'q. Biroq, ko'pincha dasturlar shunday yig'iladigan tushunchalar bilan qo'llaniladiki, o'qishni yaxshilash usulining samaradorligini o'zgartirishni xohlaydi.

Asosiy qoida, u allaqachon bir necha marta takrorlangan va men yana yaxshi bo'laman - dastur qimor ekanligiga ishonch hosil qilmaguningizcha, swidcode haqida tashvishlanmang. Shunga o'xshab, o'sha qismlarni bilib oling, topilgan narsalarni qanday amalda qo'llashni biling va u erda nafislikni samaradorlikka o'zgartiring.

Shubhasiz, kodni qayta-qayta e'tiborsiz qoldirish bizning aybimiz emas. Boy vipadkada, oyog'idagi yulduzlar kabi, ayniqsa oqlangan echimlarda soddalik kerak emas. Vaqti-vaqti bilan dasturchi oddiy pidhid hech qachon shvedcha bilan tugamasligini yana bir bor bilib oladi.

Men dríbnitsy dan o'rganish samaradorligi uchun juda boy dasturchilar-pochatkivtsiv qatnashdi biriga hurmat qilaman. Natija kattaroq, katlanadigan va ko'pincha kechirimsiz emas. Bunday dasturlarni yozish qulayroq va hid ko'pincha amaliydan ko'ra yaxshiroq emas.

Biroq, rekursiya looplarga nisbatan kamroq samarali alternativ hisoblanadi. Deyakí zavdannya viríshiti recursíêyu. Eng keng tarqalgan usul - bir nechta daraxt tanasini kesish, ularning terisi chirishi mumkin.

O'q siz uchun jumboq: qanday qilib cheksiz sonli raqamlarni 1 raqamidan boshlab, keyin 5 ni qo'shish yoki 3 ga ko'paytirish mumkin. Qanday qilib funktsiyani yozish mumkin, masalan, raqamni olib tashlash, biz Bunday qo'shish va ko'paytirishning ketma-ketligini bilishga harakat qilyapsizmi, uni qanday qilib berilgan songa etkazish kerak? Misol uchun, 13 raqamini 1 ni 3 ga ko'paytirish va keyin 5 marta qo'shish orqali olib tashlash mumkin. Va 15 raqamini olib tashlab bo'lmaydi.

Rekursiv yechim:

findSolution(target) funksiyasi (funksiya find(start, history) ( if (start == target) tarixini qaytaradi; aks holda, agar (start > target) null qaytaradi; aks holda find find(start + 5, "(" + history + " + " + 5)") || find(start * 3, "(" + history + " * 3)"); ) return find(1, "1"); ) console.log(findSolution(24)); // → (((1 * 3) + 5) * 3)

Kimning dumba obov'yazkovo emas, eng qisqa yechim bilaman - siz qanoatlantirasiz. Men tekshirmayman, dastur qanday ishlashini bir marta tushunasiz. Ammo keling, bu mo''jizada rekursiv g'oyani aniqlaymiz.

Ichki topish funksiyasi rekursiyani bajaradi. Von ikkita argumentni qabul qiladi - aniqrog'i, bu qatorning raqami, bu raqamga qanday kelganimiz haqidagi rekorddan o'ch olish uchun. Men krokivlar ketma-ketligini ko'rsatadigan qatorni yoki nullni aylantiraman.

Qaysi funksiya uchun vikonu uchtadan biri. Berilgan raqam qimmatroq bo'lishi bilanoq, tarix oqimi hali ham unga erishish yo'lida bo'ladi, bu o'zgarmaydi. Agar berilgan raqam metadan katta bo'lsa, hissiyotni ko'paytirish va katlamani davom ettirishning hech qanday usuli yo'q, bu faqat shunchalik ko'paytirilishi mumkin. Va agar biz hali belgilanmagan bo'lsak, funktsiya xafa qilishga harakat qilmoqda mumkin bo'lgan usullar, ular berilgan raqamdan boshlanadi. Von o'zini-o'zi chaqiradi, yo'llarning terisidan bir marta. Agar birinchi qo'ng'iroq null emas, balki aylantirilsa, VIN aylantiriladi. Boshqa yo'nalishda, boshqasi aylanadi.

Kerakli effektga erishish funktsiyasi sifatida yaxshiroq tushunish uchun keling, 13 raqamining echimini izlashda paydo bo'lgan vvki vikilarni ko'rib chiqaylik.

Toping(1, "1") toping(6, "(1 + 5)") toping(11, "((1 + 5) + 5)") toping(16, "(((1 + 5) + 5) ) ) + 5)") juda katta topildi(33, "(((1 + 5) + 5) * 3)") juda katta topildi(18, "((1 + 5) * 3)") juda katta topildi ( 3, "(1 * 3)") toping (8, "((1 * 3) + 5)") toping (13, "(((1 * 3) + 5) + 5)") topildi!

Kirish qo'ng'iroqlar to'plamining chuqurligini ko'rsatadi. Birinchidan, find funktsiyasi (1 + 5) va (1 * 3) dan kelib chiqadigan echimlarni qayta ko'rib chiqish uchun ikkitasini chaqiradi. Birinchi haftalik (1 + 5) ga asoslangan yechimni qidiradi va qo'shimcha rekursiyadan so'ng u siz ko'rgan barcha echimlarni kamroq yoki ko'proq kerakli raqamni o'zgartiradi. Bilmayman va nolga aylantiring. Xuddi shu operator || va qaysi variantni ishlatmoqchi bo'lsangiz, viki funksiyasiga o'ting (1*3). Bu erda biz muvaffaqiyat uchun tekshiriladi, uchinchi rekursiv siklda biz 13 oladi, bu uchun. Bu tsikl qatorni aylantiradi, va operatorlardan teri || yo'l bu qatorni yuqoriroqqa o'tadi, natijada qaror qabul qilinadi.

O'sish funktsiyalari

Funksiyalarni dasturga kiritishning ikki ko'p yoki kamroq tabiiy usullari mavjud.

Birinchidan - siz bir marta sprat uchun shunga o'xshash kodni yozasiz. Bu noyob bo'lishi kerak - ko'proq kod kechirim uchun ko'proq vaqt va dasturni tushunishga yordam beradigan jim o'qish uchun ko'proq material degani. Shunday qilib, biz funksionallikni qabul qilamiz, biz o'zimizni takrorlaymiz, uni tanlaymiz va uni funktsiyaga kiritamiz.

Boshqa usul - siz boshqa funktsiyaga qo'shiladigan varta kabi yangi funksiyalarga ehtiyojni ko'rsatasiz. Siz funksiyalarning nomlari bilan boshlaysiz, keyin esa tanani yozasiz. Funktsiyaning o'zi tan olinishidan oldin funktsiyani yutgan kodni yozishni boshlashingiz mumkin.

Funktsiya uchun nom tanlashda aqlli bo'lganlar, sizning funksionalligingizni qanchalik yaxshi ko'rsatayotganingizni ko'rsating. Keling, bir misol keltiraylik. Biz dastur yozishimiz kerak, ikkita raqamni qanday kiritishimiz kerak, fermada qancha sigir va tovuq bor, keyin "koriv" va "tovuq" so'zlari. Raqamdan oldin teri aniq uchta pozitsiyani egallashi uchun oldinga nol qo'shish kerak.

007 Koriv 011 Tovuq

Shubhasiz, bizga ikkita argumentli funksiya kerak. Keling, kodlashni boshlaylik.
// chop etish FarmInventory funktsiyasi printFarmInventory(cows, tovuqlar) ( var cowString = String(cows); while (cowString.length)< 3) cowString = "0" + cowString; console.log(cowString + " Коров"); var chickenString = String(chickens); while (chickenString.length < 3) chickenString = "0" + chickenString; console.log(chickenString + " Куриц"); } printFarmInventory(7, 11);

Yakshcho mi dodamo qatorga.uzunligi, mi otrimaêmo vv dozhina. while tsikllari raqamga bosh nollarni qo'shayotganini ko'rish uchun doklar 3 ta belgidan iborat qatorni olib tashlamaydi.

Tayyor! Ammo biz fermerga kod berishga qaror qildik (birdaniga abyakim bo'lmagan tekshiruvdan, men tushundim), unga qo'ng'iroq qilib, bizga shtatda kimdir cho'chqasi borligini va naslchilik dasturiga qo'shib bo'lmaydimi, deb aytishga qaror qildik. cho'chqalar soni?

Shubhasiz, mumkin. Va agar biz ushbu qatorlardan kodni nusxalash va joylashtirishni boshlasak, siz o'ylashingiz va o'ylashingiz kerak. Balki biz yaxshilay olamiz. Keling, dasturni yaxshilaymiz:

// PaddedWithLabel funksiyasi printZeroPaddedWithLabel(raqam, yorliq) ( var numberString = String(raqam); while (numberString.length)< 3) numberString = "0" + numberString; console.log(numberString + " " + label); } // вывестиИнвентаризациюФермы function printFarmInventory(cows, chickens, pigs) { printZeroPaddedWithLabel(cows, "Коров"); printZeroPaddedWithLabel(chickens, "Куриц"); printZeroPaddedWithLabel(pigs, "Свиней"); } printFarmInventory(7, 11, 3);

Amaliyot qiling! Biroq, printZeroPaddedWithLabel nomini berish juda qiyin. Uchta nutq bo'ladi - vysnovok, nollarni qo'shish va bu belgi - bitta funktsiyaga. Butun parchani takrorlanadigan funktsiyaga joylashtirish o'rniga, keling, bitta kontseptsiyani ko'rib chiqaylik:

// nol funksiyasini qo'shish zeroPad(raqam, kenglik) ( var string = String(raqam); while (string.length)< width) string = "0" + string; return string; } // вывестиИнвентаризациюФермы function printFarmInventory(cows, chickens, pigs) { console.log(zeroPad(cows, 3) + " Коров"); console.log(zeroPad(chickens, 3) + " Куриц"); console.log(zeroPad(pigs, 3) + " Свиней"); } printFarmInventory(7, 16, 3);

Funktsiya mehribon, tushunarli va zeroPad kodni tushunishni osonlashtiradi. Men har xil vaziyatlarda g'alaba qozona olaman, nafaqat bizning turda. Misol uchun, raqamlar bilan vysnovku v_dformatovanih jadvali.

Buti funktsiyalari qanchalik oqilona va universal bo'lishi mumkin? Yak yozishimiz mumkin eng oddiy funksiya, shuningdek, uchta pozitsiyaga nol qo'shish, shuning uchun menda raqamlarni formatlash uchun ajoyib xususiyat bor, u kasrlarni, manfiy raqamlarni ayiradi, nuqtalarni saralaydi va turli belgilar bilan to'ldiradi.

Yaxshi qoida - faqat kerakli funksiyalarni qo'shishdir. Ba'zida kichik iste'mol terisini chuqur tanib olish uchun ramkalar yaratish oson bo'lib tuyuladi. Sizga suyaning. Siz ishni hech qanday tarzda tugatmaysiz, lekin shunchaki hech kimni mag'lub etmaydigan bir nechta kod yozasiz.

Funktsiyalari va yon ta'siri

Funksiyalarni taxminan tí ga boʻlish mumkin, ular yon taʼsiri orqali chaqiriladi va qoʻshiq maʼnosini olib tashlash uchun chaqiriladi. Zvichayno, bu mumkin va bir funktsiya kamroq kuch.

Truss ilovasidagi birinchi qo'shimcha funksiya printZeroPaddedWithLabel yon effekt orqali ishga tushiriladi: qator yaratish uchun. Do'st, zeroPad, nima o'girish ma'nosi orqali. Sizga birinchi navbatda yana qanday funktsiya kerakligini bilmayman. Qiymatlarni aylantiruvchi funktsiyalarni birma-bir bajarish osonroq, yon ta'sirlarni yaratadigan pastroq funktsiyalar.

Sof funksiya - bu ma'noni aylantiruvchi maxsus turdagi funktsiyadir, chunki nafaqat nojo'ya ta'sirlar mavjud, lekin kodni hal qilish uchun hech qanday nojo'ya ta'sirlar mavjud emas - masalan, u global o'zgarishlar bilan ishlamaydi, shuning uchun uni orqaga qaytarish mumkin. Sof funktsiya, xuddi shu dalillar bilan viklikana bo'lib, xuddi shu natijani aylantiradi (va boshqa hech narsa qilish kerak emas) - nima qilish maqbuldir. Faqat undan mashq qiling. Bunday funktsiyani bosish kodning qiymatini o'zgartirmasdan, robotning natijasi bilan almashtirilishi mumkin. Agar siz bunday funktsiyani o'zgartirmoqchi bo'lsangiz, uni shunchaki chaqirishingiz va bu kontekstda to'g'ri ekanligiga ishonch hosil qilishingiz mumkin, bu har qanday holatda ham to'g'ri. Emas, balki juda sof vazifalari osonlik buzib va ​​vrakhovuvati bo'lishi mumkin boy omillar va ona yon ta'siri tufayli kuzda turli natijalar o'girib mumkin.

Biroq, juda ko'p toza funktsiyalarni yozish kerak emas, balki bunday funktsiyalar uchun kodni muqaddas tozalashni boshlash kerak. Yon ta'siri ko'pincha makkajo'xori. console.log funksiyasining toza versiyasini yozishning imkoni yo'q va bu funksiya juda tartibsiz. Deyaki operatsiyani ko'rish oson, nojo'ya ta'sirlar.

Podbag

Tsey kuchli funktsiyalarni qanday yozishni ko'rsatib, bo'lingan. Funktsiya kalit so'zi virus kabi ko'z qisib qo'ysa, indikatorni funksiya yorlig'iga aylantiring. Agar siz ko'rsatma sifatida g'alaba qozonsangiz, unga funktsiyani tayinlaydigan o'zgartirishni ovozli qilishingiz mumkin.

Rouming funktsiyalarining asosiy momenti mahalliy ko'rish maydonidir. Funktsiyaning o'rtasida ovozli, mahalliy bo'lgan o'zgartirilgan parametrlar vaqti-vaqti bilan qo'ng'iroq chaqirilganda o'zgartiriladi va qo'ng'iroq ko'rinmaydi. Boshqa funktsiyaning o'rtasida aytilgan funksiyalar butun doiraga kirish huquqiga ega bo'lishi mumkin.

Dzhe korisno rasdylyat turli vazifalar, ular dastur tomonidan o'rnatiladi, funktsiyada. Siz asl matnni tartibga solishga yordam berish uchun kitoblarni bo'lish va bo'lish kabi kodni qismlarga bo'lish, uni qismlarga bo'lish kabi funktsiyalarni takrorlamaysiz.

to'g'ri

Eng kam
Eng kichik argumentni aylantiruvchi oldingi qismga Math.min funksiyasi tayinlangan. Endi biz bu funktsiyani o'zimiz yozishimiz mumkin. Yozing funktsiya min bu ikkita argumentni oladi va ularning minimalini aylantiradi.

Console.log(min(0, 10)); // → 0 console.log(min(0, -10)); // → -10

rekursiya
Biz % operatori (pastki qismidagi ortiqcha) boshqa raqamni (% 2) yutishi mumkinligini aniqladik. Va eksa belgilashning yana bir usuli:

Nol yigitlar.
Yolg'izlik tengsizdir.
N soni mavjudmi, paritet N-2 kabi bir xil bo'ladi.

Ushbu qoidalarga muvofiq rekursiv isEven funksiyasini yozing. Siz raqamni olishingiz va mantiqiy qiymatni aylantirishingiz mumkin.

50 va 75-da test qiling. vvyy -1 vazifasini bajaring. Nega bunday daraja bor? Buni to'g'rilay olasizmi?

Uni 50 va 75 da sinab ko'ring. -1 da qanday ishlashini ko'ring. Nega? Siz bo'lganlar haqida o'ylay olasizmi?

Console.log(isEven(50)); // → true console.log(isEven(75)); // → false console.log(isEven(-1)); // → ??

Xush kelibsiz boblar.

Qatorning N belgisini .charAt(N) (“satr”.charAt(5)) qo‘shish orqali olib tashlash mumkin, shuning uchun qo‘shimcha.uzunlikdan keyingi qatorni tashlab qo‘yish kifoya. Qaytariladigan qiymat bir belgi bilan qo'shiladigan qatorda bo'ladi (masalan, "k"). Qatordagi birinchi belgi 0 pozitsiyasiga ega, ya'ni qolgan belgi string.length - 1 pozitsiyasiga ega bo'ladi. Boshqacha qilib aytganda, ikkita belgidan iborat qator 2 bo'lishi mumkin, oxirgi belgining pozitsiyalari esa 0 va bo'ladi. 1.

Argument sifatida qatorni oladigan va qator bo‘ylab harakatlanish uchun “B” belgilar sonini aylantiruvchi countBs funksiyasini yozing.

Keyin countChar funktsiyasini yozing, u taxminan countBs kabi ishlaydi, lekin boshqa parametrni oladi - biz ketma-ket shukatimemo qiladigan belgi (almashtirish shunchaki "B" belgilar sonini sanash). Kim uchun countBs funksiyasi o'tadi.

Funktsiyalar JavaScript kodidagi eng muhim kundalik bloklardan biridir.

Funktsiyalar buyruqlar to'plamidan qo'shiladi va bitta vazifaga o'xshaydi (masalan, raqamlarni yig'ish, ildizni xuddi shunday hisoblash).

Funktsiya yaqinida joylashgan kod faqat funktsiyaga aniq chaqiruvdan so'ng yoziladi.

Ovoz funksiyalari

1.Sintaksis:

//Dublyajlangan funksiya funksiyasi im'yaFunction(var1, var2)( Funksiya kodi) //Im'yaFunction(var1,var2) funksiyasini bosing;

2. Sintaksis:

// Ovozli funksiya var funksiya nomi = funktsiya (var1, lan2) (Funksiya kodi) // Funktsiya nomi chaqiruvi (var1, var2);

funktsiya nomi ularning funktsiyalarini belgilang. Onaning yon tomonidagi terining funktsiyasi o'ziga xosdir. Bu funksiyalar lotin harflarida va raqamlardan boshlanishi mumkin.

per1і per2ê zminnimi chi qiymatlari, yaki funksiyaning o'rtasiga o'tkazish mumkin. Teri funktsiyasi sunnat qilinmagan o'zgarishlar soniga o'tkazilishi mumkin.

Hurmat qiling: E'tibor bering, funktsiyaga hech qanday o'zgartirish kiritilmaydi.Funktsiya nomidan keyin "()" dumaloq yoylarni qo'yishni unutmang.

Hurmat qiling: JavaScript funksiya nomlari katta-kichik harflarga sezgir.

Butt JavaScript funktsiyalari

Tugmachani bosgandan keyingina osib qoʻyilgan dumbaning messageWrite() funksiyasi oʻchirib qoʻyiladi.

Hurmat qiling: Bu dumbada bosish tugmasi bor. JavaScript-ni yuboring yordamchingizda batafsil ko'rib chiqiladi.

O'zgartirish funktsiyalarini uzatish

Funktsiyalarga istalgan miqdordagi o'zgartirishlar kiritishingiz mumkin.

Hurmat qiling: funktsiyalarning o'rtasida o'zgarishlar bo'yicha barcha manipulyatsiyalar o'zgarishlarning o'zi va ularning nusxalari ustida haqiqatan ham tebranadi, shuning uchun o'zgarishlarning o'rniga funktsiyalarning natijalari o'zgarmaydi.

/* O'tkazilgan o'zgartirishga 10 qo'shish uchun funktsiyani o'rnating va natijani yon tomonda ko'rsating */ funktsiya plus(a)( a=a+10; document.write("Ko'rish funktsiyasi: " + a+"
"); ) var a=25; document.write("Haftalik funksiya oldidagi oʻzgarish qiymati: "+a+"
"); // Biz uni o'tkazadigan funktsiyani plus(a); hujjatni o'zgartirish uchun argument sifatida chaqiramiz. write("Qo'ng'iroqdan keyin o'zgartirilgan funksiyaning qiymati: "+a+"
");

shvidky qayta ko'rib chiqish

Nusxalarni emas, balki funksiyalarning global o'zgarishini ko'rib chiqish uchun teg window.im'ya_change.

Function plus(a)( window.a=a+10; ) var a=25; document.write("Haftalik funktsiyadan oldingi o'zgarish qiymati: "+a+"
"); plus(a); document.write("Qo'ng'iroq funksiyasidan keyingi o'zgarish qiymati: "+a+"
");

shvidky qayta ko'rib chiqish

qaytarish buyrug'i

Yordam buyrug'i uchun qaytish Funktsiyalardan qiymatlarni aylantirishingiz mumkin.

shvidky qayta ko'rib chiqish

Kiritilgan funksiyalar

Qisqa deb hisoblangan funktsiyalar kremi JavaScript-da ko'proq narsa bor funksiyalarni joriy qildi.

Masalan, funktsiya cheksiz siz o'tgan qiymat haqiqiy raqam ekanligini qayta ko'rib chiqish imkonini beradi.

Document.write(isFinite(40)+"
"); document.write(isFinite(-590)+"
"); document.write(isFinite(90.33)+"
"); document.write(isFinite(NaN)+"
"); document.write(isFinite("Finite")+"
");

shvidky qayta ko'rib chiqish

Hurmat qiling: to'liq ro'yxat Taqdim etilgan JavaScript funksiyalari haqida bizdan bilib olishingiz mumkin.

Mahalliy va global o'zgarishlar

Funktsiyalarning o'rtasida joylashgan o'zgarishlar yaratilishlari deyiladi mahalliy o'zgarishlar. Xushbo'y hid tayinlangan funktsiyalarning o'rtasida siz bunday kamroq o'zgarishlarga o'tishingiz mumkin.

Funktsiya kodi o'zgartirilgandan so'ng, u o'zgaradi. Tse turli funktsiyalar uchun bir xil nomlarga o'zgartirishlar tayinlash mumkinligini anglatadi.

O'zgarishlar, ular yaratilganda, posture funktsiya kodi deb ataladi global o'zgarishlar bunday zminnyxga kodning istalgan joyidan uzoqlashish mumkin.

Funktsiyaning o'rtasida o'zgarishni varsiz hal qilsangiz, u ham global bo'ladi.

Global o'zgarishlar faqat yopiq tomondan keyin kamayadi.

shvidky qayta ko'rib chiqish

Hurmat qiling: ekranda ko'rsatilganda var2 bo'sh qiymatga o'zgartiriladi, func1 ning parchalari var2 ning mahalliy "versiyasi" bilan ishlaydi.

Anonim funktsiyalar Wiki

Ovoz berish soati nomidan o'ch olmaydigan funksiyalar deyiladi anonim.

Anonim funktsiyalar, asosan, asosiy funktsiya sifatida kodga kichik chaqiruv uchun emas, balki parametr sifatida boshqa funktsiyalarga o'tish uchun kar bo'ladi.

Funktsiya arrMap(arr,func)( var res=new Array; for (var i=0;i) ");

shvidky qayta ko'rib chiqish

O'zingizni o'stiring

Bosh 1. Quyidagi koddagi kechirim so'zlarini to'g'rilang:

Bosh 1

Koddagi kechirim so'zini to'g'rilang.

Menejer 2.

  1. Turli parametrlarni uzatish xatti-harakatlarini tekshirgandan so'ng 1-3 funktsiya kodini kiriting.
  2. 4-funktsiya bilan birgalikda kalit so'zni belgilang.

Menejer 2

//Birinchi maxfiy funktsiya hujjatni bosing.write(secfunc1(4,12) + "
"); // Wiklik boshqa maxfiy funktsiya document.write(secfunc2(100,10) + "
"); // Uchinchi maxfiy funktsiyaning Vikligi secfunc3(23,10); document.write("
"); // To'rtinchi maxfiy funktsiyani chaqirish secfunc4("n");

Disqus sharh tizimini tezlashtirish uchun JavaScript-ni yoqing.

Operator qaytish oqim funksiyasini tugatadi va qiymatni aylantiradi.

Interaktiv dasturning chiqish kodi GitHub-dagi omborda saqlanadi. Agar siz interaktiv ilovalar loyihalarida ishtirok etishni istasangiz, xushmuomala bo'ling, https://github.com/mdn/interactive-examples manziliga o'ting.

Sintaksis

qaytish [[viraz]]; Viraz Viraz, uning ma'nosi aylantiriladi. Agar u ko'rsatilmagan bo'lsa, yangisini almashtirish aniqlanmagan holda aylantiriladi.

Tavsif

Qaytish bayonoti bosilganda, funktsiyalar bog'lanadi. Belgilangan qiymat funksiya haftasining oyigacha aylantiriladi. Misol uchun, quyida uning argumenti qiymatining kvadratini aylantirish funksiyasi x (bu erda x butun son):

function square(x) ( return x * x; ) var demo = square(3); // demo qiymati qiymati 9

Qaysi qiymatni aylantirish ko'rsatilmagan, yangisini aylantirish o'rniga aniqlanmagan.

Vikonannya funktsiyalarini to'xtatish uchun bosqichma-bosqich virazi zavzhda:

qaytish; haqiqatni qaytarish; yolg'onni qaytarish; qaytish x; qaytish x + y/3;

Nuqtalarni bo'laklardan avtomatik ravishda yoyish

funktsiya magic(x) ( qaytish funktsiyasi calc(x) ( return x * 42 ); ) var answer = magic(); javob (1337); // 56154

Texnik xususiyatlari

Spetsifikatsiya Holat Sharh
ECMAScript 1-nashr (ECMA-262) Standart Pochatkove shahridagi uchrashuv
ECMAScript 5.1 (ECMA-262)
Standart
ECMAScript 2015 (6-nashr, ECMA-262)
Ushbu spetsifikatsiya uchun "Qaytish bayonoti" ni tayinlash.
Standart
ECMAScript oxirgi loyihasi (ECMA-262)
Ushbu spetsifikatsiya uchun "Qaytish bayonoti" ni tayinlash.
Chernetka

Brauzerlar bilan aralashish

Uchinchi tomondagi yig'indisi jadvali ma'lumotlarning tuzilishi natijasida yaratilgan. Agar siz maʼlumotlarga oʻz hissangizni qoʻshmoqchi boʻlsangiz, ularni https://github.com/mdn/browser-compat-data omboridan olib tashlang va oʻzgartirishlaringizni yoqish uchun bizga soʻrov yuboring.

GitHub-da muvofiqlik ma'lumotlarini yangilang

KompyuterlarMobilserver
ChromechekkaFirefoxInternet ExplorerOperasafariandroid veb-ko'rinishiAndroid uchun ChromeAndroid uchun FirefoxAndroid uchun OperaIOS uchun SafariSamsung InternetNode.js
qaytishChrome Povna pidtrimka 1 chekka Povna pidtrimka 12 Firefox Povna pidtrimka 1 IE Povna pidtrimka 3 Opera Povna pidtrimka Shunday qilibsafari Povna pidtrimka Shunday qilibandroid veb-ko'rinishi Povna pidtrimka 1 Chrome Android Povna pidtrimka 18 Firefox Android Povna pidtrimka 4 OperaAndroid Povna pidtrimka Shunday qilibSafari iOS Povna pidtrimka Shunday qilibSamsung Internet Android Povna pidtrimka 1.0 nodejs Povna pidtrimka Shunday qilib

© 2022 androidas.ru - Android haqida hamma narsa