Switch և Ցիկլեր

"Կրկնությունը գիտության մայրն է, իսկ ընտրությունը՝ արդյունավետության գրավականը:"

switch-ը փոխարինում է մի քանի if-երին և կատարում է խիստ համեմատություն (===):

Կառուցվածք

switch(x) {
  case 'val1':
     ... Կատարվող գործողությունները
      break;
  case 'val2':
     ... Կատարվող գործողությունները
      break;
  default:
     ... Կատարվող գործողությունները
}

Break-ի Կարևորությունը

Առանց break-ի, կոդը կշարունակի կատարվել հաջորդ case-երի մեջ՝ անկախ պայմանից:

Ցիկլերը թույլ են տալիս կատարել նույն կոդը բազմաթիվ անգամներ:

for Ցիկլ

for (let i = 0; i < 3; i++) {
  alert(i);
}

սկիզբ, պայման, քայլ:

while Ցիկլ

while (i < 3) {
  alert(i);
  i++;
}

break & continue

break-ը դուրս է գալիս ցիկլից, իսկ continue-ն թռչում է դեպի հաջորդ քայլը:

do...while

Կոդը կատարվում է գոնե մեկ անգամ, նույնիսկ եթե պայմանը սխալ է:

flowchart TD Start["Start Loop"] --> Cond{"Condition?"} Cond e1@-->|True| Body["Execute Body"] Body e2@--> Step["Step / i++"] Step e3@--> Cond Cond -->|False| End["End Loop"] e1@{ animate: true } e2@{ animate: true } e3@{ animate: true } style Cond fill:none,stroke:#f7df1e,stroke-width:2px style Body fill:#61afef,stroke:#61afef,color:#fff style Start fill:none,stroke:#fff style End fill:none,stroke:#fff

JavaScript-ում յուրաքանչյուր կատարվող ֆունկցիա, կոդի բլոկ կամ սկրիպտ ունի իրեն կցված ներքին օբյեկտ, որը կոչվում է Lexical Environment:

Կառուցվածք

  • Environment Record: Պահպանում է բոլոր տեղային փոփոխականները:
  • Outer Reference: Հղում դեպի արտաքին (outer) միջավայր:

Ինչպե՞ս է աշխատում

Երբ փնտրում ենք փոփոխական, JS-ը նախ նայում է ներքին միջավայրում, ապա՝ արտաքինում, մինչև հասնի Global միջավայրին:

Ինչպե՞ս է աշխատում Scope Chain-ը

Այս դիագրամը պատկերում է JavaScript-ի լեքսիկական հիերարխիան կոդի կատարման պահին: Այն ցույց է տալիս, թե ինչպես են փոփոխականները հասանելի դառնում տարբեր կոնտեքստներում՝ շնորհիվ շղթայական կապի:

1. Environment Record

Յուրաքանչյուր միջավայր (Global, Outer, Inner) ունի իր Environment Record-ը: Սա այն վայրն է, որտեղ JS շարժիչը կատարման նախնական փուլում (Instantiation phase) գրանցում է տվյալ տիրույթում հայտարարված բոլոր փոփոխականները և ֆունկցիաները:

  • Inner: Ունի իր սեփական innerVar-ը:
  • Outer: Պահում է outerVar-ը:
  • Global: Հանդիսանում է ամենավերին մակարդակը:

2. Outer Reference

Յուրաքանչյուր Lexical Environment ունի հղում ([[OuterEnv]] սլաքը), որը մատնանշում է այն միջավայրը, որտեղ տվյալ կոդը ֆիզիկապես գրված է:

  • Inner-ի հղումը տանում է դեպի Outer:
  • Outer-ի հղումը տանում է դեպի Global:
  • Global-ի հղումը null է:

3. Որոնման մեխանիզմը (Resolve Binding)

Երբ փորձում եք օգտագործել որևէ փոփոխական Inner տիրույթում, JavaScript-ը կատարում է հետևյալ քայլերը.

  1. Փնտրում է այն լոկալ Environment Record-ում:
  2. Եթե չի գտնում, օգտվում է Outer Reference-ից և բարձրանում մեկ մակարդակ վերև:
  3. Այս գործընթացը կրկնվում է մինչև Global միջավայր:

Կարևոր է: Այս շղթան կայուն է և որոշվում է կոդը գրելու պահին (Lexical Scoping): Սա հենց այն հիմքն է, որի վրա կառուցվում են Closures-ը:

flowchart BT subgraph Global ["🌐 Global Environment"] G_Rec["Environment Record (globalVar: 10)"] G_Null["Outer: null"] end subgraph OuterEnv ["📦 Outer Function"] O_Rec["Environment Record (outerVar: 20)"] O_Ref["Outer Reference"] e_out@-->|"points to"| G_Rec end subgraph InnerEnv ["🔍 Inner Closure"] I_Rec["Environment Record (innerVar: 30)"] I_Ref["Outer Reference"] e_in@-->|"points to"| O_Rec end e_in@{ animate: true } e_out@{ animate: true } %% Styles style InnerEnv fill:none,stroke:#f7df1e,stroke-width:2px style OuterEnv fill:none,stroke:#61afef,stroke-width:2px style Global fill:none,stroke:#ffffff,stroke-dasharray: 5 5 style I_Rec fill:#1e2227,color:#abb2bf,stroke:#3e4451 style O_Rec fill:#1e2227,color:#abb2bf,stroke:#3e4451 style G_Rec fill:#1e2227,color:#abb2bf,stroke:#3e4451 style I_Ref color:#f7df1e,stroke:none,fill:none style O_Ref color:#61afef,stroke:none,fill:none