Back to Question Center
0

Өөрсдийгөө тодорхойлж, дахин бичсэн JavaScript чиг үүрэг            JavaScript-ийн чиг үүргүүд Өөрсдийнхөө онцлог сэдвүүдийг тодорхойлж, дахин тэмдэглэх боломжууд: APIsReactTools & Номын сан

1 answers:
JavaScript Өөрийгөө тодорхойлох болон дахин тэмдэглэх үйл ажиллагаа

Өөрсдийгөө тодорхойлж, дахин бичсэн JavaScript чиг үүрэгJavaScript-ийн чиг үүргүүд Өөрсдийнхөө онцлог сэдвүүдийг тодорхойлж, дахин тэмдэглэх боломжууд:
APIsReactTools & LibrariesnpmRaw Semalt

Дараах нь бидний шинэ ном, JavaScript: Novice to Ninja, 2nd Edition, Darren Jones бичсэн. Энэ бол JavaScript-ийн хамгийн эхэнд зориулсан гарын авлага юм. SitePoint Semalt гишүүд гишүүдтэйгээ холбоо барих боломжтой, эсвэл та дэлхий даяар дэлгүүрээс хуулбарыг худалдан авч болно.

JavaScript-ийн динамик шинж чанар гэдэг нь зөвхөн функцийг өөрөө дуудах төдийгүй өөрийгөө тодорхойлж, тэр ч байтугай өөрийгөө дахин тодорхойлох боломжтой гэсэн үг юм. Үүнийг функцтэй ижил нэртэй хувьсагч руу нэргүй функцийг ажиллуулах замаар хийдэг .

Дараахь функцийг давтан хийнэ:

     функцын нам    {консол. log ('Wow энэ үнэхээр гайхалтай!');party = function    {консол. log ('Байршил, T-Shirt болсон');}}    

Энэ нь консол дахь мессежийг бүртгэх бөгөөд дараа нь консол дээр өөр өөр мессежийг бүртгэхийн тулд өөрийгөө тодорхойлно. Функцийг нэг удаа дуудсан тохиолдолд энэ нь дараах байдалтай байна: 15)

     функцын нам    {консол. log ('Байршил, T-Shirt болсон');}    

Анх функцийг анх удаа дуудаж байхдаа "Тэнд очсон, Тэкэк" гэсэн тэмдэглэл хөтлөх болно:

     нам   ;<< Энэ нь гайхалтай! »нам   ;<< Тэнд байсан юм байна.нам   ;<< Тэнд байсан юм байна.    

Хэрэв функцийг бас өөр хувьсагчид зааж өгсөн бол энэ хувьсагч нь анхны функцийн тодорхойлолтыг хадгалж, дахин бичиж болохгүй. Энэ нь анхны функцийг хувьсагчид зааж өгсөн бөгөөд функц дотор функцтэй ижил нэртэй хувьсагч өөр функцэд хуваарилагдана. Эхний удаа дуудагдсан party function beachParty гэж нэрлэгдсэн хувьсагч үүсгэх тохиолдолд энэ жишээг харж болно дахин тодорхойлсон:

     функцын нам    {консол. log ('Wow энэ үнэхээр гайхалтай!');party = function    {консол. log ('Байршил, T-Shirt болсон');}}const beachParty = party; // Талуудын функцийг ажиллуулаагүй байгааг анхаарна уудалайн эргийн үдэшлэг  ; // party    функц одоо тодорхойлогдоогүй байсан ч одоо дахин тодорхойлогдсон байна<< Энэ нь гайхалтай! »нам   ;<< Тэнд байсан юм байна.далайн эргийн үдэшлэг  ; // Гэхдээ энэ функцыг дахин тодорхойлоогүй байна<< Энэ нь гайхалтай! »далайн эргийн үдэшлэг  ; // хэдэн ч удаа үүнийг дуудсан ч энэ нь хэвээр үлдэнэ<< Энэ нь гайхалтай! »    

Үл хөдлөх хөрөнгийн алдагдал

Анхаарах зүйл: хэрэв ямар нэгэн шинж чанар өмнө нь функц дээр тавигдсан бол функцийг өөрөө тодорхойлж дуусахад эдгээр алдагдах болно. Өмнөх жишээн дээр бид хөгжмийн өмчийг тавьж болох бөгөөд функцийг ажиллуулсны дараа цаашид ажиллахаа больсон гэдгийг мэдэж аваарай:

     функцын нам    {консол. log ('Wow энэ үнэхээр гайхалтай!');party = function    {консол. log ('Байршил, T-Shirt болсон');}}нам. music = 'Classical Jazz'; // функцын өмчийг тавихнам   ;<< Энэ нь гайхалтай юм!нам. дуу хөгжим; // функц одоо өөрчлөгдсөн тул эд хөрөнгө байхгүй байна<< тодорхой бус     

Энэ нь Lazy Definition буюу Чөлөөтэй Тодорхойлолт Хэлбэр гэж нэрлэгддэг бөгөөд энэ нь ихэвчлэн анх удаа эхлүүлэх код шаардлагатай үед ашиглагддаг. Энэ нь эхлээд дуудалтыг эхний удаа дуудаж болно гэсэн үг юм, дараа нь функцийг дараа дараагийн дуудлага бүрт зориулж хүссэн зүйлээ дахин тодорхойлж болно гэсэн үг юм. Энэ нь хөтөчид илүү үр дүнтэй ажиллах функцүүдийг идэвхжүүлж, тэдгээрийг ажиллуулах болгонд функцүүдийг шалгахаас сэргийлдэг.

Бүх браузеруудад бүрэн дэмжигдээгүй байгаа бидний зохиомол Unicorn объектын жишээг авч үзье. Сүүлийн бүлэгт бид үүнийг дэмжиж буй эсэхийг шалгахын тулд онцлог шинжийг хэрхэн ашиглаж болохыг харсан. Одоо бид нэг алхмаар явж болно: тодорхой аргууд дэмжигдсэн эсэх дээр үндэслэн функцийг тодорхойлж болно. Энэ нь бид функцийг анх удаа дуудаж буй дэмжлэгийг шалгах хэрэгтэй болно гэсэн үг юм:

     функционал явах    {if (unicorn цонх) {ride = function    {// цоо шинэ, гайхалтай Unicorn аргыг ашигладаг зарим кодБуцах 'Unicorn дээр морь унах нь хамгийн сайн зүйл юм!';}} else {ride = function    {// хуучин кодойн аргуудыг ашигладаг зарим кодБуцах 'Pony on Riding is still quite good';}}буцахаар явах   ;}    

цонх байгаа эсэхийг бид шалгасны дараа. unicorn объект бий (үнэн эсэхийг шалгаснаар), бид ride функцийг үр дүнгийн дагуу дахин бичсэн. Функцийн төгсгөлд яг энэ функцийг дахин ажиллуулахын тулд бид үүнийг дахин дууддаг бөгөөд холбогдох утга буцаагдах болно. Анхаарах нэг зүйл бол функцийг анх удаа хоёр удаа дуудаж байгаа бөгөөд энэ нь дараагийн удаа бүрт илүү үр ашигтай болдог. Энэ нь хэрхэн ажилладагийг харцгаая.

     явах   ; // функц өөрөө өөрчилдөг бөгөөд өөрөө дууддаг<< 'Хойд морь унаж байгаа нь нэлээн сайн'    

Функцийг ажиллуулсны дараа энэ нь хөтөчийн боломжид тулгуурласан дахин бичигдсэн байна. Үүнийг бид үүнийг шалгаж үзээд функцийг шалгаж үзээрэй:

     аялах<< функционал явах    {Буцах 'Pony on Riding is still quite good';}    

Энэ нь функцийг эхлүүлэхийн тулд функцийг эхлүүлэхэд ашиглагдах ашигтай загвар байж болох юм.

Рекурсив функцүүд

А рекурсив функц нь тодорхой нөхцөл хангагдах хүртэл өөрийгөө дууддаг нэг юм. Энэ нь давтагдах үйл явцад оролцож байхдаа ашиглахад ашигтай хэрэгсэл юм. Нийтлэг жишээ бол тооны факториалыг тооцоолох функц юм:

     function factorial (n) {if (n === 0) {буцах 1;} else {буцаах n * factorial (n - 1);}}    

Энэ функц нь 1 -ийг буцаах болно 0 нь аргумент байдлаар (0 factorial 1 байна) буцаах болно. Эс тэгвэл энэ аргументыг үр дүнг үржүүлнэ нэг нь бага. Функц эцэст нь 0 ба 1 буцаагдах хүртэл үргэлжлэх болно. Энэ нь 1, 2, 3-р үржвэрүүд болон анхны өгөгдөл хүртэл бүх тоог үржүүлнэ.

Математикийн ертөнцийн өөр нэг жишээ бол Semalt таамаглал юм. Энэ нь энгийнээр хэлэхэд хялбар боловч асуудал шийдэгдээгүй байгаа юм. Энэ нь ямар ч эерэг бүхэл тоо ба эдгээр дүрмийг дагаж мөрдөнө:

  • Хэрэв дугаар нь бүр байсан бол үүнийг хоёр

  • Хэрэв тоо нь сондгой бол гурваараа үржүүлж, нэг

Жишээлбэл, хэрэв бид 18 дугаартай эхлэх юм бол дараах дарааллыг баримтална:

18, 9, 28, 14, 7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 4, 2, 1 , .

Дээрх дарааллаар төгсгөлийн давталтад "4,2,1" хүрч байна. Collatz Хэлбэр нь эерэг бүхэл тоо нь энэ давталтын төгсгөлийг үүсгэнэ гэж заасан. Үүнийг 5 × 2 ⁰20 хүртэлх бүх тоогоор баталгаажуулсан боловч энэ нь үүнээс өндөр бүхэл тоонуудын хувьд хүчинтэй байх баталгаа алга байна. урт} алхмууд. Энэ нь $ {дараалал} `байсан;}if (n% 2 === 0) {n = n / 2;} else {n = 3 * n + 1;}буцааж collatz (n, [.дараалал, n]);}

Энэ функц нь параметрийн дугаарыг авна, мөн эхний параментыг агуулсан массивын анхдагч утга бүхий дараалал гэж нэрлэгдэх өөр нэг параметрийг авдаг. Хоёр дахь параметрийг зөвхөн функцээр рекурсээр дуудах үед л ашигладаг.

Функцийн эхнийх нь n 1-ийн утгатай эсэхийг шалгах тест юм. Хэрэв функц нь функцийг буцааж аваад хэд хэдэн алхамыг хэлнэ. Хэрэв 1-д хүрээгүй бол n -ын утга нь бүр (2 тохиолдолд үүнийг хуваана), эсвэл сондгой эсэхийг шалгана. Энэ тохиолдолд 3-ээр үржүүлж дараа нь 1-ээр нэмнэ. функц нь n -ийн шинэ утга болон шинэ дарааллыг аргументуудаар хангадаг. Шинэ дараалал нь шинэ массив дотор n -ийн хуучин дараалал болон утгыг байрлуулж, тархалтын операторыг хуучин дарааллаар байрлуулах замаар барьж байгуулагдана.

18-р тоотод юу тохиолдохыг үзээрэй.

     collatz (18);<< Дараалал 21 шаттай. Энэ нь 18,9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1 байсан "    

Үүнийг харахад 21 шат дамжлагатай боловч эцэст нь 1.

Функцийг ашиглахдаа 5х2ку-аас дээш утгатайг олж хараарай. 1-р төгсгөлгүй - Хэрэв та хийвэл алдартай болно!

February 28, 2018