Izpratne par JavaScript slēgšanu cilpās: praktiski piemēri

Izpratne par JavaScript slēgšanu cilpās: praktiski piemēri
Izpratne par JavaScript slēgšanu cilpās: praktiski piemēri

Ciklu slēgšanu atšķetināšana JavaScript

JavaScript izstrādātāji bieži saskaras ar neparedzētu rīcību, izmantojot slēgšanu cilpu iekšpusē. Šī problēma var radīt neskaidrības, īpaši tiem, kam slēgšanas jēdziens ir jauns.

Šajā rakstā mēs izpētīsim praktiskus piemērus, kas ilustrē izplatītākās nepilnības un piedāvā risinājumus efektīvai slēgšanu izmantošanai cilpās neatkarīgi no tā, vai runa ir par notikumu uztvērējiem, asinhrono kodu vai atkārtošanu masīvos.

Komanda Apraksts
let Deklarē lokālo mainīgo ar bloka darbības jomu, pēc izvēles inicializējot to līdz vērtībai. Izmanto, lai nodrošinātu, ka katrai cilpas iterācijai ir savs tvērums.
const Deklarē bloka darbības jomas, tikai lasāmu nosauktu konstanti. Izmanto, lai izveidotu funkciju vai mainīgo, kura vērtība nedrīkst mainīties.
Promise Apzīmē asinhronas darbības iespējamo pabeigšanu (vai kļūmi) un tās iegūto vērtību.
setTimeout Izsauc funkciju vai novērtē izteiksmi pēc noteikta milisekunžu skaita.
addEventListener Noteiktam elementam pievieno notikumu apdarinātāju, nepārrakstot esošos notikumu apdarinātājus.
IIFE Nekavējoties izsauktās funkcijas izteiksme. Funkcija, kas darbojas, tiklīdz tā ir definēta. Izmanto lokālo tvērumu izveidei cilpās.
for...in Atkārtojas pār neskaitāmajām objekta īpašībām patvaļīgā secībā.
for...of Atkārtojas pār iterējama objekta (piemēram, masīva vai virknes) vērtībām noteiktā secībā.

Izpratne par JavaScript slēgšanu cilpās

Iepriekšējos piemēros sniegtie skripti pievēršas bieži sastopamajai problēmai, kas saistīta ar JavaScript cilpu aizvēršanu. Lietojot a var deklarāciju cilpas ietvaros, visām iterācijām ir viena un tā pati funkciju joma. Tāpēc pirmajā piemērā izvade ir "Mana vērtība: 3" trīs reizes. Risinājums ir izmantot let, kas izveido bloka tvērumu, kas katrai iterācijai saglabā pareizo vērtību. Šī pieeja nodrošina, ka katrai iterācijai ir savs tvērums, tādējādi saglabājot pareizo vērtību, kad funkcija tiek izsaukta. Skripts parāda, kā mainīt deklarāciju no var uz let novērš problēmu un reģistrē "Mana vērtība: 0", "Mana vērtība: 1" un "Mana vērtība: 2", kā paredzēts.

Asinhronajam kodam var rasties tāda pati slēgšanas problēma. Izmantojot Promises un setTimeout funkcijas ar let nodrošina, ka katrs asinhronais zvans saglabā pareizo iterācijas vērtību. Skripts parāda, ka, izmantojot wait ar let, katrs izpildītais solījums reģistrē paredzamo vērtību. Arī notikumu klausītāji var saskarties ar līdzīgām problēmām; tomēr klausītāja funkcijas ietīšana an IIFE (Tūlīt izsauktās funkcijas izteiksme) palīdz uztvert pareizo vērtību, izveidojot jaunu tvērumu katrai iterācijai. Pielietojums for...in un for...of cilpas vēl vairāk parāda tvēruma noteikšanas nozīmi slēgšanā, parādot, kā pareizi tvert indeksu un vērtību, izmantojot IIFE lai katrai cilpas iterācijai izveidotu atšķirīgas darbības jomas.

Slēgšanas problēmu risināšana JavaScript cilpās, izmantojot let

JavaScript (ES6)

let funcs = [];
// Let's create 3 functions
for (let i = 0; i < 3; i++) {
  // and store them in funcs
  funcs[i] = function() {
    // each should log its value.
    console.log("My value:", i);
  };
}
for (let j = 0; j < 3; j++) {
  // and now let's run each one to see
  funcs[j]();
}

Pareizu slēgšanas vērtību nodrošināšana asinhronajā kodā

JavaScript (ES6)

const wait = (ms) => new Promise((resolve, reject) => setTimeout(resolve, ms));
for (let i = 0; i < 3; i++) {
  // Log `i` as soon as each promise resolves.
  wait(i * 100).then(() => console.log(i));
}

Pareiza slēgšana notikumu uztvērējos, izmantojot IIFE

JavaScript (ES6)

var buttons = document.getElementsByTagName("button");
// Let's create 3 functions
for (var i = 0; i < buttons.length; i++) {
  // as event listeners
  (function(i) {
    buttons[i].addEventListener("click", function() {
      // each should log its value.
      console.log("My value:", i);
    });
  })(i);
}

Pareiza aizvēršana ar for...in and for... of Loops

JavaScript (ES6)

const arr = [1, 2, 3];
const fns = [];
for (const i in arr) {
  fns.push(((i) => () => console.log("index:", i))(i));
}
for (const v of arr) {
  fns.push(((v) => () => console.log("value:", v))(v));
}
for (const n of arr) {
  const obj = { number: n };
  fns.push(((n, obj) => () => console.log("n:", n, "|", "obj:", JSON.stringify(obj)))(n, obj));
}
for (const f of fns) {
  f();
}

Slēgšanu izmantošanas izpēte uzlabotajās JavaScript funkcijās

Slēgšana ir JavaScript pamatjēdziens, kas ļauj funkcijai piekļūt mainīgajiem no tās aptverošā tvēruma pat pēc tam, kad šī joma ir aizvērta. Šī funkcija ir īpaši jaudīga, veidojot uzlabotas funkcijas, piemēram, tās, kuras tiek izmantotas iegaumēšanai, kariēšanai un funkcionālajai programmēšanai. Piemēram, iegaumēšana izmanto aizvēršanu, lai atcerētos dārgu funkciju izsaukumu rezultātus un atgrieztu kešatmiņā saglabāto rezultātu, kad atkārtojas tās pašas ievades. Izmantojot slēgšanu, mēs varam izveidot efektīvāku un optimizētāku kodu, kas uzlabo veiktspēju, īpaši rekursīvās funkcijās, piemēram, Fibonači secību aprēķināšanā.

Vēl viena uzlabota aizvēršanas izmantošana ir privātu mainīgo un funkciju izveide JavaScript objektos, simulējot privātās metodes un rekvizītus. Šo paņēmienu bieži izmanto moduļu modeļos un nekavējoties izsauktajās funkciju izteiksmēs (IIFE), lai iekapsulētu funkcionalitāti un izvairītos no globālās darbības jomas piesārņošanas. Turklāt slēgšanai ir izšķiroša nozīme notikumu apstrādē un asinhronajā programmēšanā, kur tās palīdz saglabāt stāvokli un kontekstu laika gaitā. Slēgšanu izpratne un efektīva izmantošana var ievērojami uzlabot jūsu JavaScript programmēšanas prasmes un dot iespēju rakstīt modulārāku, atkārtoti lietojamu un uzturējamu kodu.

Bieži uzdotie jautājumi par JavaScript slēgšanu

  1. Kas ir JavaScript slēgšana?
  2. Slēgšana ir funkcija, kas saglabā piekļuvi tās leksiskajam tvērumam pat tad, ja funkcija tiek izpildīta ārpus šī tvēruma.
  3. Kāpēc aizvēršanās notiek cilpās?
  4. Cilpas tiek slēgtas, jo cilpa rada funkcijas, kas tver vienu un to pašu mainīgā atsauci, kas izraisa neparedzētu darbību, ja tās netiek pareizi apstrādātas.
  5. Kā mēs varam novērst slēgšanas problēmas cilpās?
  6. Izmantojot let tā vietā var cilpās vai izmantojot IIFE (Tūlītēji izsauktās funkciju izteiksmes) var novērst slēgšanas problēmas, izveidojot jaunu tvērumu katrai iterācijai.
  7. Kas ir IIFE?
  8. An IIFE ir funkcija, kas tiek izpildīta uzreiz pēc tās izveides, un to bieži izmanto, lai izveidotu jaunu tvērumu un izvairītos no mainīgo konfliktiem.
  9. Vai slēgšanu var izmantot asinhronajā programmēšanā?
  10. Jā, slēgšana ir būtiska asinhronajā programmēšanā, lai saglabātu stāvokli un kontekstu asinhronajās darbībās, piemēram, solījumos un atzvanījumos.
  11. Kas ir iegaumēšana un kā slēgšana palīdz?
  12. Memoization ir optimizācijas paņēmiens, lai saglabātu kešatmiņā dārgu funkciju izsaukumu rezultātus. Slēgšana palīdz, saglabājot piekļuvi kešatmiņai vairāku funkciju izsaukumos.
  13. Kā slēgšana palīdz notikumu risināšanā?
  14. Slēgšana saglabā notikumu apstrādātājiem nepieciešamo mainīgo stāvokli, nodrošinot to pareizu darbību, kad notikums tiek aktivizēts.
  15. Kāds ir JavaScript moduļa modelis?
  16. Moduļa modelis izmanto slēgšanu, lai izveidotu privātus mainīgos un funkcijas, iekapsulējot funkcionalitāti un izvairoties no globāla mēroga piesārņojuma.
  17. Vai slēgšana var simulēt privātās metodes JavaScript?
  18. Jā, slēgšanas var simulēt privātās metodes, saglabājot mainīgos lielumus un funkcijas pieejamus tikai funkcijas tvērumā, kur tie ir definēti.

Pēdējās domas par JavaScript slēgšanu cilpās

Lai rakstītu paredzamu un efektīvu kodu, ir ļoti svarīgi apgūt JavaScript slēgšanu, jo īpaši cilpu ietvaros. Izmantojot sviras efektu let, Promises, un IIFE, izstrādātāji var izvairīties no bieži sastopamām kļūmēm un nodrošināt pareizu mainīgo tvērumu. Šī izpratne uzlabo spēju apstrādāt asinhronus uzdevumus un uz notikumiem balstītu programmēšanu, kas galu galā noved pie spēcīgākām lietojumprogrammām.