<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: dav</title>
    <description>The latest articles on DEV Community by dav (@dav2bit).</description>
    <link>https://dev.to/dav2bit</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1246314%2F7c3d8883-e16a-4646-bca7-f4bc22438c9a.png</url>
      <title>DEV Community: dav</title>
      <link>https://dev.to/dav2bit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dav2bit"/>
    <language>en</language>
    <item>
      <title>Closure-ները JavaScript-ում.</title>
      <dc:creator>dav</dc:creator>
      <pubDate>Thu, 04 Jan 2024 13:09:12 +0000</pubDate>
      <link>https://dev.to/dav2bit/closure-nere-javascript-owm-2pf6</link>
      <guid>https://dev.to/dav2bit/closure-nere-javascript-owm-2pf6</guid>
      <description>&lt;p&gt;Երբևէ լսե՞լ եք JavaScript-ում closure-ների մասին շատերին այն բարդ ու անհասկանալի է թվում(ինձ թվում է անունից է) բայց մի անհանգստացեք դա այնքան էլ բարդ չէ, որքան թվում  է &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bO5g_mKu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2naab2y9bcvld0hf2zss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bO5g_mKu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2naab2y9bcvld0hf2zss.png" alt="Image description" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;JavaScript-ում closure-ները նման են տուփի որը պահում է ֆունկցիան և այն միջավայրը որում ֆունկցիան հայտարավել է, այն թույլ է տալիս ֆունկցիային հիշել այն միջավայրը որում այն ստեղծվել է( այդ միջավայրի փոփոխականները): այսինքն javascript ում ֆունկցիան ոչ միայն ունի այն փոփոխականները որոնք հայտարարվել են իր մեջ կամ ստացել է որպես արգումենտ այլ նաև այն scop-ի փոփոխականները որում ֆունկցիան հայտարարել ենք։ շուտով ամեն ինչ ավելի պարզ կդառնա&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Եկեք պարզենք կախարդանքը պարզ օրինակներով.&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let name = 'Dav'
function seyHi(){
    console.log('hello ' + name)
}

seyHi()
//hello Dav
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;այստեղ մենք հայտարարել ենք ֆունկցիա որը օգտագործում է իր ծնող scop ի փոփոխականը (այն scop-ի որում հայտարարվել է) և այդ ֆունկցիան նորմալ աշխատում է և փոփոխականի կախվածության հետ միասին կոչվում է Closure։ այսպիսով ֆունկցիան իր կախվածությունների հետ(այն փոփոխականների որոնք նա օգտագործում է բայց հայտարարված են իրենից դուրս) միասին կոչվում է Closure հայերեն կարող են ասել "փակում" (մի փոքր ծիրծացելի թարգմանություն է բայց այո բառացի այդպես է թարգմանվում)  &lt;/p&gt;

&lt;p&gt;նայենք մեկ այլ օրինակ&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function outerFunction() {
  let outerVariable = "ես դրսում եմ հայտարարված!";

  function innerFunction() {
    console.log(outerVariable);
  }

  return innerFunction;
}

const closureFunction = outerFunction();
closureFunction(); // Output: ես դրսում եմ հայտարարված
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;այստեղ մենք հայտարարել ենք ֆունկցիա outerFunction անունով դրա մեջ outerVariable անունով փոփոխական ու մի ֆունկցիայել innerFunction անունով որը տպում է outerVariable փոփոխականը հետո վերադրաձնում ենք ներսում հայտարարված ֆունցիան՝ innerFunction-ը։&lt;br&gt;
և այո javascript ում հնարավոր է որպես արժեք վերադրաձնել ֆունցիան ու երբ այն ֆունկցիան որը վերադարձնում է տվյալ ֆունկցիան վերագրվում է փոփոխականին կարելի է ասել որ այդ փոփոխականը դառնում է հղում ներսի ֆունկցիայի համար որը հնարավոր է կանչել(եթե չհասկացաք ուղակի նայեք կոդին)&lt;/p&gt;

&lt;p&gt;այսպիսով ինչ կատարվեց innerFunction ը օգտագործում է outerVariable-ը որը հայտարարված է իր ծնող ֆունկցիայում և դա հնարավոր է որովհետև innerFunction-ը պահում է outerVariable փոփոխականը(ի շնորիվ Closure-ի)&lt;/p&gt;

&lt;p&gt;debugger ում կարող եք նայել closure-ները: նայեք նկարի կոդին և closure-ները&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Mu8O-KA1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mg8g1g79kcalct8yg9nm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Mu8O-KA1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mg8g1g79kcalct8yg9nm.png" alt="Image description" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;հիմա եկեք մի փոքր բարդացնենք&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let globalVariable = "ես global scop ում եմ գտնվում"
function outerFunction() {
  let outerVariable = "ես դրսում եմ հայտարարված!";

  function innerFunction() {
    console.log(outerVariable);
    console.log(globalVariable );
  }

  return innerFunction;
}

const closureFunction = outerFunction();
closureFunction(); // Output: "ես դրսում եմ հայտարարված!"                           
                   // Output։ ""ես global scop ում եմ գտնվու 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;global scop ում ավելացրել եմ փոփոխական globalVariable  անունով ու այն օգտագործել եմ innerFunction ում և ամեն ինչ դեռ աշխատում է ինչի քանի որ outerFunction ը պահում է global scop ի փոփոխականները(քանի որ այդտեղ է հայտարարվել) իսկ innerFunction ը outerFunction-ի մեջ գտնվուղ փոփոխականները ու այդպես "ժառանգաբար" innerFunction ը կարող է օգտագործել global scop ի փոփոխականները։ ի շնորհիվ դրա ֆունկցիաները կորող են իրենց կրող scop ի փոփոխականները օգտագործել նաև իրենց կրող scop ը կրող scop-ում գտնվող փոփոխականները և այդպես մինչև global scop բոլոր փոփոխականները այլ կերպ ասած ինենց scop ից վեր գտնվող բոլոր scop-երի փոփոխականները&lt;/p&gt;

&lt;p&gt;եկեք նայենք մեկ այլ օրինակ&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function f(){

  function k(){
    var x = 10

    }
  k()
  console.log(x)

}


f() // Output: ReferenceError: x is not defined"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;հայտարարել եմ f ֆունկցիա դրա մեջ k անունով ֆունկցիա և k ֆունկցիայի մեջ x անունով փոփոխական իսկ հետո  f() ֆունկցիայում փորձել օգտագործել x ը և ReferenceError: x is not defined" հմմ ինչի։ քանի որ ֆունկցիան պահում է միայն իրեն կրող scop ի փոփոխականները իսկ k ֆունկցիան գտնվում է f ի մեջ այսինքն k ի մեջ հասանելի են f ի փոփոխականները բայց հակառակը ոչ նույն կերպել global scop ում հասանելի չեն f և k ֆունկցիաներում հայտարարված փոփոխականները բայց global scop ի փոփոխականները հասանելի են 2 ֆունկցիաներումել &lt;/p&gt;

&lt;p&gt;իրականում jsvasctipt ի engin-ը ավելի խելացի է և միայն պահում է այն փոփոխականները որոնք ֆունկցիան օգտագործում է և եթե global scop-ում պահենք n անունով փոփոխակամ և չօգտագործենք f ֆունկցիայում f ը չի պահի այդ փոփոխականը&lt;/p&gt;

&lt;p&gt;կարող եք նաև տեսահոլովակ նայել նույն թեմայով&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.youtube.com/watch?si=We8qGCj8C-AV9Gj1&amp;amp;v=bfbYbPTkUmg&amp;amp;feature=youtu.be" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--vNWXqC1P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.ytimg.com/vi/bfbYbPTkUmg/maxresdefault.jpg%3Fsqp%3D-oaymwEmCIAKENAF8quKqQMa8AEB-AHUBoAC4AOKAgwIABABGEwgUihlMA8%3D%26rs%3DAOn4CLDwOikBdhwMQAaF2K-gRu9q-De-zQ" height="450" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.youtube.com/watch?si=We8qGCj8C-AV9Gj1&amp;amp;v=bfbYbPTkUmg&amp;amp;feature=youtu.be" rel="noopener noreferrer" class="c-link"&gt;
          Javascript - Փակումներ (Closures) - YouTube
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Հղումներ----------------Javascript դասընթաց: https://youtube.com/playlist?list=PLkVo56yGU5Pqld7f3jtoE-g_755aPT0NVՖեյսբուքյան էջ: https://www.facebook.com/rou...
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--mMMteknp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.youtube.com/s/desktop/f4449159/img/favicon.ico" width="16" height="16"&gt;
        youtube.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



</description>
    </item>
    <item>
      <title>ինչ է Hoisting ը JavaScript-ում</title>
      <dc:creator>dav</dc:creator>
      <pubDate>Wed, 03 Jan 2024 09:36:42 +0000</pubDate>
      <link>https://dev.to/dav2bit/inch-e-hoisting-e-javascript-owm-3gea</link>
      <guid>https://dev.to/dav2bit/inch-e-hoisting-e-javascript-owm-3gea</guid>
      <description>&lt;p&gt;այսպիսով javascript engine ը ունի առաջին հայացքից մի փոքր տարօրինակ բայց հետաքրքիր վարքագիծ այն փոփոխակաները class-ները function-ները բարձրացնում է  տվիալ scop-ի ամենավերևը դա տեղի է ունենում compilation ի փուլում և կոչվում է hoisting այն օգտակար է բայց եթե չգիտես ինչպես է աշխատում կարող խնդիրներ առաջացնել&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n5R61KYN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3tw4a5zl8o6dwexrfncw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n5R61KYN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3tw4a5zl8o6dwexrfncw.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Function Hoisting
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function printHello() {
  console.log("hello")
}

printHello()
// hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Այստեղ մենք հայտարարում ենք printHello ֆունկցիան և անմիջապես հետո կանչում այդ ֆունկցիան: Սխալներ չկան ամեն ինչ աշխատում է!&lt;/p&gt;

&lt;p&gt;Այժմ նայեք այս օրինակին.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;printHello()
// hello

function printHello() {
  console.log("hello")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;հմմ Այստեղ մենք կանչում ենք printHello ֆունկցիան նախքան այն հայտարարելը: Եվ ամեն ինչ դեռ աշխատում է առանց սխալների: Ի՞նչ է տեղի ունեցել այստեղ։ hoisting .&lt;/p&gt;

&lt;p&gt;Նախքան interpreter-ը կկատարի կոդը, այն նախ բարձրացնում է հայտարարված ֆունկցիաները scop-ի ամենավերևը(այն scop-ի որում ֆունկցիան հայտարարված է)։ hoistion-ի միջոցով ֆունկցիան հասանելի է դառնում նույնիսկ նախքան հայտարարելը։&lt;/p&gt;

&lt;p&gt;Տեսնենք մեկ այլ օրինակ.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;printHello()
// hello

printWorld()
// ReferenceError: printWorld is not defined

function printHello() {
  console.log('hello')

  function printWorld() {
    console.log("world")
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ինչպես տեսնում եք այստեղ, մենք հայտարարում ենք printHello ֆունկցիան. որը տպում է 'hello' այնուհետև հայտարարում ենք մեկ այլ ֆունկցիա, որը կոչվում է printWorld, որը տպում է 'world' , երբ կանչվում է:&lt;/p&gt;

&lt;p&gt;Նախքան printHello ֆուկցիան հայտարարելը, մենք փորձում ենք կանչել այն՝ printHello(). և Այն հասանելի է (ի շնորհիվ hoisting ի այն բարձրացել է global scop ի ամենավերևը), ուստի մենք «hello» ենք տեսնում console-ում:&lt;/p&gt;

&lt;p&gt;Բայց հետո մենք կանչում ենք printWorld-ը, և ստանում ենք ReferenceError. printWorld-ը սահմանված չէ : Արդյո՞ք hoisting ը տեղի չի ունենում printWorld ի դեպքում:&lt;/p&gt;

&lt;p&gt;hoisting ը աշխատում է, բայց այն "բարձրացնում է" միայն այն scop ի վերին մաս, որտեղ հայտարարվել է ֆունկցիան տվիալ դեպքում printHello ֆունկցիայի սքոփի վերևը: Հետևաբար, այն հասանելի կլինի միայն այդ ֆունկցիայում: Եկեք թարմացնենք մեր կոդը.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;printHello()
// hello

function printHello() {
  printWorld()
  // world

  console.log('hello')

  function printWorld() {
    console.log("world")
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Այժմ մենք կանչում ենք printWorld ֆունկցիան printHello ֆունկցիայի վերևում, բայց նախքան printWorld ը հայտարարելը և այն աշխատում է Քանի որ hoisting ը ֆունկցիան բարձրացնում է local scop ի վերևը, և մենք կարող ենք մուտք գործել այն նախքան հայտարարելը&lt;/p&gt;

&lt;p&gt;hoisting-ը այս ամենը հնարավոր է դարձնում function declaration-ների համար: Բայց, հարկ է նաև նշել, որ այն չի աշխատի function expression-ների դեպքում:  դրա մասին կգրեմ մեկ այլ անգամ&lt;/p&gt;

&lt;p&gt;Հիմա եկեք նայենք փոփոխականների hoisting ը:&lt;/p&gt;

&lt;h2&gt;
  
  
  Variable Hoisting
&lt;/h2&gt;

&lt;p&gt;Դուք կարող եք փոփոխականներ հայտարարել JavaScript-ում var, let, և const keyword-ներով: Եվ այս փոփոխականները կենթարկվեն hoisting-ի, բայց այլ կերպ: Սկսենք var-ից.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;var&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Նայեք այս օրինակին.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(name)
// undefined

var name = "Dav"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Այստեղ մենք հայտարարում ենք name անունով փոփոխական, որի արժեքը «dav» է: Բայց երբ մենք փորձում ենք մուտք գործել փոփոխական նախքան այն հայտարարելը ոչ մի սխալ չենք ստանում: hoisting է տեղի ունեցել. name փոփոխականը "բարձրացվել է" ուստի թարգմանիչը «գիտի», որ կա փոփոխական, որը կոչվում է name: Եթե ​​թարգմանիչը չիմանար, դուք կստանաք անունը սահմանված չէ : Եկեք փորձենք.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(name)
// ReferenceError: name is not defined

var myName = "Dav"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Մենք ունենք փոփոխական, որը կոչվում է, myName (ոչ թե name): և ստանում ենք «անունը սահմանված չէ» սխալ, երբ փորձում ենք&lt;br&gt;
վերցնել name-ի արժեքը: Թարգմանիչը «չգիտի» այս փոփոխականի մասին։&lt;/p&gt;

&lt;p&gt;Վերադառնալով վերը նշված մեր օրինակին.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(name)
// undefined

var name = "Dav"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Թեև hoisting ը տեղի է ունեցել այստեղ, բայց nameո ի արժեքը որոշված ​​չէ, երբ մենք մուտք ենք գործում այն ​​նախքան հայտարարելը: եթե փոփոխականը հայտարարված է var ով հայտարարությունը բարձրացվում է, բայց իր default արժեքով` undefined: Փաստացի արժեքը փոխվում է, երբ հայտարարման տողը կատարվում է և այդ տողից հետո փոփոխականին մուտք գործելով՝ մենք ստանում ենք իրական արժեքը.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
console.log(name)&lt;br&gt;
// undefined&lt;/p&gt;

&lt;p&gt;var name = "Dav"&lt;/p&gt;

&lt;p&gt;console.log(name)&lt;br&gt;
// Dav&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ենթադրենք, name ը հայտարարել ենք ֆունկցիայի մեջ.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
print()&lt;/p&gt;

&lt;p&gt;console.log(name)&lt;br&gt;
// ReferenceError: name is not defined&lt;/p&gt;

&lt;p&gt;function print() {&lt;br&gt;
  var name = "Dav"&lt;br&gt;
}&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Այստեղ մենք ստանում ենք ReferenceError. անունը սահմանված չէ : Հիշեք, որ փոփոխականները բարձրացվում են, բայց միայն այն scop ի վերին մաս որտեղ նրանք հայտարարվել են: Այս դեպքում, name-ը հայտարարված է print ֆունկցիայում, այնպես որ այն կբարձրացվի այդ local scop-ի վերև: Փորձենք մուտք գործել այն ֆունկցիայում.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
print()&lt;/p&gt;

&lt;p&gt;function print() {&lt;br&gt;
  console.log(name)&lt;br&gt;
  // undefined&lt;/p&gt;

&lt;p&gt;var name = "dav"&lt;br&gt;
}&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Փորձելով մուտք գործել name ֆունկցիայում, թեև այն գտնվում է հայտարարման տողից վեր, մենք սխալ չենք ստանում: Դա պայմանավորված է նրանով որ name ը բարձրացված է(hoisting), բայց մի մոռացեք, որ իր default արժեքով` undefined:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;let&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Թեև let փոփոխականները  նույնպես ենթարկվում են hoisting ի, նրանք ունեն այլ վարքագիծ: Տեսնենք մի օրինակ.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(name)
// ReferenceError: Cannot access 'name' before initialization

let name = "Dav"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Այստեղ մենք ստանում ենք ReferenceError. Հնարավոր չէ մուտք գործել «name» նախքան հայտարարելը : Նկատո՞ւմ եք, որ սխալն ասում է, որ name ը սահմանված չէ : Դա պայմանավորված է նրանով, որ թարգմանիչը «տեղյակ է» name փոփոխականի մասին, քանի որ փոփոխականը ենթարկվել է hoisting ի:&lt;/p&gt;

&lt;p&gt;«Cannot access 'name' before initialization» տեղի է ունենում, քանի որ հայտարարված let փոփոխականները չունեն default արժեք, երբ ենթարկվում է hoisting-ի(բարձրացվում է): Ինչպես տեսանք var, փոփոխականներն ունեն default արժեք՝ undefined մինչդեռ let, փոփոխականները չեն 'սկզբնավորվում':&lt;/p&gt;

&lt;p&gt;Փոփոխականները բարձրացվում են այն scop ի վերին մաս, որտեղ նրանք հայտարարված են (local կամ glbal), բայց հասանելի չեն, քանի որ չեն սկզբնավորվել: Այդ հատվածը կոչվում է Temporal Dead Zone(ժամանակավոր մեռյալ գոտի):&lt;/p&gt;

&lt;p&gt;Դրանք կարող են հասանելի լինել միայն հայտարարման տողից հետո.&lt;/p&gt;

&lt;p&gt;_const _&lt;/p&gt;

&lt;p&gt;const ի դեպքում ամեն ինչ նույն է ինչ let ի դեպքում&lt;/p&gt;

&lt;p&gt;console.log(name)&lt;br&gt;
// ReferenceError: Cannot access 'name' before initialization&lt;/p&gt;

&lt;p&gt;const name = "Dav"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Class&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;JavaScript-ի class-ները նույնպես բարձրացվում են(hoisting): Տեսնենք մի օրինակ.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Dog = new Animal("jeko")
// ReferenceError: Cannot access 'Animal' before initialization

class Animal {
  constructor(name) {
    this.name = name
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Այստեղ մենք հայտարարում ենք class, որը կոչվում է Animal. Մենք փորձում ենք մուտք գործել այս class (ստեղծելով Dog օբյեկտ) նախքան այն հայտարարելը: Մենք ստանում . ReferenceError հնարավոր չէ մուտք գործել «Animal» նախքան սկզբնավորումը : Ի՞նչ է ձեզ հիշեցնում այս սխալը:&lt;/p&gt;

&lt;p&gt;Ճիշտ այնպես, ինչպես let և constփոփոխականների դեպքում, class ները բարձրացվում են այն scop ի վերևում, որտեղ նրանք սահմանվել են, բայց անհասանելի են այնքան ժամանակ, քանի դեռ չեն սկզբնավորվել:&lt;/p&gt;

&lt;p&gt;Եկեք թարմացնենք կոդը.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Animal {
  constructor(name) {
    this.name = name
  }
}

const Dog = new Animal("jeko")

console.log(Dog)
// { name: 'jeko' }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Animal ը հայտարարելուց հետո այն դառնում է հասանելի, այնպես որ մենք կարող ենք ստեղծել Dog առանց սխալների:&lt;/p&gt;

&lt;p&gt;և այսպես երբեմն կտեսնեք այսպիսի կոդ&lt;/p&gt;

&lt;p&gt;՝՝՝&lt;br&gt;
function1()&lt;br&gt;
function2()&lt;br&gt;
function3()&lt;/p&gt;

&lt;p&gt;// lines of code&lt;br&gt;
// lines of code&lt;/p&gt;

&lt;p&gt;function function1() {...}&lt;br&gt;
function function2() {...}&lt;br&gt;
function function3() {...}&lt;br&gt;
՝՝՝&lt;/p&gt;

&lt;p&gt;այստեղ ֆունկցաները իրենց տրամաբանությամբ հայտարարված են ներգևում բայց օգտագործվում կոդի մեջ  ավելի վերև այն աշխատում է ի շնորհիվ hoisting ի իսկ փոփոխականների և class ների դեպքում ամեն ինչ այլ է&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>JavaScript-ում Null-ի և Undefined-ի միջև եղած տարբերությունը</title>
      <dc:creator>dav</dc:creator>
      <pubDate>Tue, 02 Jan 2024 07:00:52 +0000</pubDate>
      <link>https://dev.to/dav2bit/javascript-owm-null-i-ew-undefined-i-mijew-eghats-tarberowtyowne-2khn</link>
      <guid>https://dev.to/dav2bit/javascript-owm-null-i-ew-undefined-i-mijew-eghats-tarberowtyowne-2khn</guid>
      <description>&lt;p&gt;JavaScript-ը, որպես բազմակողմանի և լայնորեն օգտագործվող ծրագրավորման լեզու, ունի որոշ առանձնահակություններ և նրբություններ: «null» և «undefaind» Երկու տերմին, որոնք հաճախ շփոթեցնում են ծրագրավորողներին, հատկապես նրանց, ովքեր նոր են տիրապետում լեզվին: Թեև երկուսն էլ ներկայացնում են արժեքի բացակայությունը, նրանք ունեն տարբեր իմաստներ և օգտագործման դեպքեր JavaScript-ում: Այս հոդվածում մենք կխորանանք null-ի և undefined-ի միջև եղած տարբերությունների մասին&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wTEo3iIg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8oefkpium5xhhwutnnfq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wTEo3iIg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8oefkpium5xhhwutnnfq.jpg" alt="Image description" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Undefined:
&lt;/h2&gt;

&lt;p&gt;JavaScript-ում փոփոխականին default վերագրվում է undefined երբ այն հայտարարվում է, բայց սկզբնական արժեք չունի: կամ երբ մուտք ենք գործում օբյեկտի գոյություն չունեցող property: Օրինակ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let x;
console.log(x); // Outputs: undefined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Վերոնշյալ օրինակում փոփոխականը հայտարարված է, բայց արժեք չի նշվում, ինչի արդյունքում այն ​​ավտոմատ կերպով սահմանվում է undefined.&lt;/p&gt;

&lt;h2&gt;
  
  
  Null:
&lt;/h2&gt;

&lt;p&gt;Մյուս կողմից, null-ը արժեք է, որը պետք է հստակորեն նշանակվի: Այն հաճախ օգտագործվում է օբյեկտի արժեքի &lt;em&gt;միտումնավոր&lt;/em&gt; բացակայությունը ցույց տալու համար: Ի տարբերություն undefined-ի, որը default արժեք է փոփոխականների համար, null-ը ծրագրավորողի կողմից կանխամտածված ընտրություն է: Օրինակ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let y = null;
console.log(y); // Outputs: null

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Կարևոր տարբերություններից մեկy null-ի և undefined-ի այն է, թե ինչպես են նրանք վարվում համեմատության ժամանկա: null-ի տիպը օբյեկտ է, մինչդեռ undefined-ի տիպը հենց undefined է: Դրանք համեմատելիս դրանք արժեքով հավասար են, բայց ոչ տեսակով.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log(null == undefined); // Outputs: true
console.log(null === undefined); // Outputs: false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Առաջին համեմատությունը ( ==) ստուգում է արժեքների հավասարությունը, իսկ երկրորդը ( ===) ստուգում է և՛ արժեքը, և՛ տեսակը: Ընդհանուր առմամբ խորհուրդ է տրվում օգտագործել խիստ հավասարություն ( ===)՝ անսպասելի տիպի տարբերություններից խուսափելու համար:&lt;/p&gt;

&lt;p&gt;Ամփոփելով, JavaScript-ում null-ի և undefined-ի միջև տարբերությունը հասկանալը կարևոր է մաքուր և առանց սխալների կոդ գրելու համար: Թեև երկուսն էլ ներկայացնում են արժեքի բացակայություն, undefined-ը սովորաբար default վիճակ է, որը ավտոմատ կերպով նշանակվում է լեզվի կողմից, մինչդեռ null-ը ծրագրավորողի կողմից արված  ընտրություն է:&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
