<?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: Roman Kuzyk</title>
    <description>The latest articles on DEV Community by Roman Kuzyk (@rmnkk).</description>
    <link>https://dev.to/rmnkk</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%2F292779%2F94b636ec-faac-4bf6-bc58-3214874bc3bd.jpg</url>
      <title>DEV Community: Roman Kuzyk</title>
      <link>https://dev.to/rmnkk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rmnkk"/>
    <language>en</language>
    <item>
      <title>The Differences Between var, let, and const Through the Prism of the ECMAScript Standard.</title>
      <dc:creator>Roman Kuzyk</dc:creator>
      <pubDate>Sat, 24 Aug 2024 13:06:45 +0000</pubDate>
      <link>https://dev.to/rmnkk/the-differences-between-var-let-and-const-through-the-prism-of-the-ecmascript-standard-26dh</link>
      <guid>https://dev.to/rmnkk/the-differences-between-var-let-and-const-through-the-prism-of-the-ecmascript-standard-26dh</guid>
      <description>&lt;p&gt;Many articles explain the differences between &lt;code&gt;var&lt;/code&gt;, &lt;code&gt;let&lt;/code&gt;, and &lt;code&gt;const&lt;/code&gt; using terms such as &lt;strong&gt;hoisting&lt;/strong&gt;, &lt;strong&gt;Temporal Dead Zone(TDZ)&lt;/strong&gt;, &lt;strong&gt;functional&lt;/strong&gt; and &lt;strong&gt;block scope&lt;/strong&gt;, etc., often without referencing the standard. Some of those terms are not even included in the language standard. It's perfectly fine to explain the topic without referencing the language standard. However, I explain the topic by referencing it for those who want to dig a bit deeper, as understanding the ECMAScript standard is crucial for a comprehensive grasp of JavaScript.&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ECMAScript
&lt;/h2&gt;

&lt;p&gt;Many organisations have their references for JavaScript, such as &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript" rel="noopener noreferrer"&gt;MDN Web Docs&lt;/a&gt;, &lt;a href="http://javascript.info" rel="noopener noreferrer"&gt;javascript.info&lt;/a&gt;, and others. However, there is one standards organisation whose sole purpose is to standardise and document computer systems. This organisation is &lt;a href="https://ecma-international.org/" rel="noopener noreferrer"&gt;Ecma International&lt;/a&gt;, a reliable authority in the field. The organisation maintains a standard called &lt;a href="https://ecma-international.org/publications-and-standards/standards/ecma-262/" rel="noopener noreferrer"&gt;ECMA-262&lt;/a&gt;, a company's internal number to identify the standard. Ecma International defines this standard as the backbone of the ECMAScript general-purpose programming language, which we commonly call JavaScript. Understanding this standard is key to understanding the language itself. The latest standard as of August 2024 is the 15th edition of ECMAScript, also known as &lt;a href="https://262.ecma-international.org/15.0/index.html?_gl=1*t6jy41*_ga*MTI0NjkxODY1MC4xNzIxOTMxODM0*_ga_TDCK4DWEPP*MTcyNDUwMDI1OS4zNy4xLjE3MjQ1MDA5MjYuMC4wLjA." rel="noopener noreferrer"&gt;&lt;strong&gt;ECMAScript 2024&lt;/strong&gt;&lt;/a&gt;. &lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Execution Context
&lt;/h2&gt;

&lt;p&gt;To understand the differences between &lt;code&gt;var&lt;/code&gt;, &lt;code&gt;let&lt;/code&gt;, and &lt;code&gt;const&lt;/code&gt;, it's essential to understand the concept of &lt;a href="https://262.ecma-international.org/15.0/index.html?_gl=1*hea1h0*_ga*MTI0NjkxODY1MC4xNzIxOTMxODM0*_ga_TDCK4DWEPP*MTcyMTkzMTgzMy4xLjEuMTcyMTkzMjE1My4wLjAuMA..#running-execution-context" rel="noopener noreferrer"&gt;&lt;code&gt;Execution Context&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Execution Context&lt;/code&gt; is an abstract structure defined in the ECMAScript standard. It is the environment where the current code is executed. To simplify things, we can assume a &lt;code&gt;Global Execution Context&lt;/code&gt; and a &lt;code&gt;Functional Execution Context&lt;/code&gt; exist.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Global Execution Context&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;globalVariable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is a global variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;outerFunction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Outer Function Execution Context&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;outerVariable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is an outer variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;innerFunction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Inner Function Execution Context&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;innerVariable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is an inner variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;innerFunction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;outerFunction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;To track the code's execution, &lt;code&gt;Execution Context&lt;/code&gt; includes several components, known as state components. Among these, the &lt;code&gt;LexicalEnvironment&lt;/code&gt; and &lt;code&gt;VariableEnvironment&lt;/code&gt; are crucial when understanding the behaviour of &lt;code&gt;var&lt;/code&gt;, &lt;code&gt;let&lt;/code&gt;, and &lt;code&gt;const&lt;/code&gt; keywords.&lt;br&gt;&lt;br&gt;
Both &lt;code&gt;LexicalEnvironment&lt;/code&gt; and &lt;code&gt;VariableEnvironment&lt;/code&gt; are &lt;a href="https://262.ecma-international.org/15.0/index.html?_gl=1*hea1h0*_ga*MTI0NjkxODY1MC4xNzIxOTMxODM0*_ga_TDCK4DWEPP*MTcyMTkzMTgzMy4xLjEuMTcyMTkzMjE1My4wLjAuMA..#sec-environment-records" rel="noopener noreferrer"&gt;&lt;code&gt;Environment Records&lt;/code&gt;&lt;/a&gt;. &lt;code&gt;Environment Record&lt;/code&gt; is also an abstract data structure defined in the ECMAScript standard. It establishes the association of &lt;code&gt;Identifier&lt;/code&gt;s to specific variables and functions. An &lt;code&gt;Identifier&lt;/code&gt; is a name that references values, functions, classes and other data structures in JavaScript. In the following example, &lt;code&gt;let variable = 42&lt;/code&gt;, &lt;code&gt;variable&lt;/code&gt; is the variable's name (&lt;code&gt;Identifier&lt;/code&gt;) that stores the value of the number 42.&lt;br&gt;&lt;br&gt;
Every time code is executed, the &lt;code&gt;Execution Context&lt;/code&gt; creates a new &lt;code&gt;Environment Record&lt;/code&gt;. Besides storing &lt;code&gt;Identifier&lt;/code&gt;s &lt;code&gt;Environment Record&lt;/code&gt; has an &lt;code&gt;[[OuterEnv]]&lt;/code&gt; field, either &lt;code&gt;null&lt;/code&gt; or a reference to an outer &lt;code&gt;Environment Record&lt;/code&gt;.&lt;br&gt; &lt;br&gt;
Graphically, &lt;code&gt;Execution Context&lt;/code&gt; and &lt;code&gt;Environment Record&lt;/code&gt; from the previous example could be represented like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Global Execution Context&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;globalVariable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is a global variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;outerFunction&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Function&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Outer Function Execution Context&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;outerVariable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is an outer variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;innerFunction&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Function&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="nx"&gt;Global&lt;/span&gt; &lt;span class="nx"&gt;Execution&lt;/span&gt; &lt;span class="nx"&gt;Context&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;// Inner Function Execution Context&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;innerVariable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is an inner variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="nx"&gt;Outer&lt;/span&gt; &lt;span class="nb"&gt;Function&lt;/span&gt; &lt;span class="nx"&gt;Execution&lt;/span&gt; &lt;span class="nx"&gt;Context&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another important point to remember about the &lt;code&gt;Execution Context&lt;/code&gt; is that it has two distinct phases: the &lt;strong&gt;Creation Phase&lt;/strong&gt; and the &lt;strong&gt;Execution Phase&lt;/strong&gt;. These two phases are vital in understanding the difference between &lt;code&gt;var&lt;/code&gt; and &lt;code&gt;let&lt;/code&gt; or &lt;code&gt;const&lt;/code&gt;.&lt;br&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Let and Const Declarations
&lt;/h2&gt;

&lt;p&gt;In the paragraph &lt;a href="https://262.ecma-international.org/15.0/index.html?_gl=1*hea1h0*_ga*MTI0NjkxODY1MC4xNzIxOTMxODM0*_ga_TDCK4DWEPP*MTcyMTkzMTgzMy4xLjEuMTcyMTkzMjE1My4wLjAuMA..#sec-declarations-and-the-variable-statement" rel="noopener noreferrer"&gt;14.3.1 Let and Const Declarations&lt;/a&gt; of ECMAScript standard the following is stated:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; declarations define variables that are scoped to the running execution context's &lt;code&gt;LexicalEnvironment&lt;/code&gt;. The variables are created when their containing &lt;code&gt;Environment Record&lt;/code&gt; is instantiated but may not be accessed in any way until the variable's &lt;code&gt;LexicalBinding&lt;/code&gt; is evaluated. A variable defined by a &lt;code&gt;LexicalBinding&lt;/code&gt; with an &lt;code&gt;Initializer&lt;/code&gt; is assigned the value of its &lt;code&gt;Initializer&lt;/code&gt;'s &lt;code&gt;AssignmentExpression&lt;/code&gt; when the &lt;code&gt;LexicalBinding&lt;/code&gt; is evaluated, not when the variable is created. If a &lt;code&gt;LexicalBinding&lt;/code&gt; in a let declaration does not have an Initializer the variable is assigned the value undefined when the &lt;code&gt;LexicalBinding&lt;/code&gt; is evaluated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To understand this statement, I will explain it sentence by sentence.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; declarations define variables that are scoped to the running execution context's &lt;code&gt;LexicalEnvironment&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It means variables created with the &lt;code&gt;let&lt;/code&gt; or &lt;code&gt;const&lt;/code&gt; keywords are scoped to the block where they were defined. The code block is any JavaScript code inside the curly braces.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;blockScopedVariable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is a block-scoped variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blockScopedVariable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// This is a block-scoped variable&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blockScopedVariable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// ReferenceError: blockScopedVariable is not defined&lt;/span&gt;

&lt;span class="c1"&gt;// Global Execution Context&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;condition&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
  &lt;span class="c1"&gt;// Block Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is a block-scoped variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="nx"&gt;Global&lt;/span&gt; &lt;span class="nx"&gt;Execution&lt;/span&gt; &lt;span class="nx"&gt;Context&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The variables are created when their containing &lt;code&gt;Environment Record&lt;/code&gt; is instantiated but may not be accessed in any way until the variable's &lt;code&gt;LexicalBinding&lt;/code&gt; is evaluated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As previously mentioned, the &lt;code&gt;Execution Context&lt;/code&gt; has two phases. This statement means that during the &lt;strong&gt;Creation Phase&lt;/strong&gt; of the &lt;code&gt;Execution Context&lt;/code&gt;, variables are stored in their corresponding &lt;code&gt;Environment Record&lt;/code&gt; but have not yet been assigned any value. They are &lt;code&gt;uninitialised&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;varaible&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// ReferenceError: Cannot access 'varaible' before initialization&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;varaible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;

&lt;span class="c1"&gt;// Global Execution Context Creation Phase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;uninitialised&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because the variable is already created (instantiated) in the &lt;code&gt;Environment Record&lt;/code&gt;, the &lt;code&gt;Execution Context&lt;/code&gt; knows about it but can't access it before evaluation(the &lt;strong&gt;Execution Phase&lt;/strong&gt; of the &lt;code&gt;Execution context&lt;/code&gt;). The state of the variable being uninitialised is also known as a &lt;strong&gt;Temporary Dead Zone(TDZ)&lt;/strong&gt;. We would have a different error if the variable hadn't been created in the &lt;code&gt;Environment Record&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;varaible&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// ReferenceError: varaible is not defined&lt;/span&gt;

&lt;span class="c1"&gt;// Global Execution Context Creation Phase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;A variable defined by a &lt;code&gt;LexicalBinding&lt;/code&gt; with an &lt;code&gt;Initializer&lt;/code&gt; is assigned the value of its &lt;code&gt;Initializer&lt;/code&gt;'s &lt;code&gt;AssignmentExpression&lt;/code&gt; when the &lt;code&gt;LexicalBinding&lt;/code&gt; is evaluated, not when the variable is created.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;LexicalBinding&lt;/code&gt; is a form of the &lt;code&gt;Identifier&lt;/code&gt;, which represents the variable's name. The &lt;code&gt;Initializer&lt;/code&gt; is the variable's value, and &lt;code&gt;AssignmentExpression&lt;/code&gt; is the expression used to assign that value to the variable's name, such as the '=' sign in &lt;code&gt;let variable = 42&lt;/code&gt;. Therefore, the statement above means that variables created with &lt;code&gt;let&lt;/code&gt; or &lt;code&gt;const&lt;/code&gt; keywords are assigned their value during the &lt;strong&gt;Execution Phase&lt;/strong&gt; of the &lt;code&gt;Execution Context.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;

&lt;span class="c1"&gt;// Global Execution Context Creation Phase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;uninitialised&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Global Execution Context Execution Phase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If a &lt;code&gt;LexicalBinding&lt;/code&gt; in a let declaration does not have an Initializer the variable is assigned the value undefined when the &lt;code&gt;LexicalBinding&lt;/code&gt; is evaluated.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This means that if a &lt;code&gt;let&lt;/code&gt; variable is created without an initial value, &lt;code&gt;undefined&lt;/code&gt; is assigned to it during the &lt;strong&gt;Execution Phase&lt;/strong&gt; of the &lt;code&gt;Execution Context.&lt;/code&gt; Variables declared with the &lt;code&gt;const&lt;/code&gt; keyword behave differently. I will explain it in a few paragraphs later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;variable&lt;/span&gt;
&lt;span class="c1"&gt;// Global Execution Context Creation Phase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;uninitialised&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Global Execution Context Execution Phase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The standard also defines a subsection called &lt;a href="https://262.ecma-international.org/15.0/index.html?_gl=1*hea1h0*_ga*MTI0NjkxODY1MC4xNzIxOTMxODM0*_ga_TDCK4DWEPP*MTcyMTkzMTgzMy4xLjEuMTcyMTkzMjE1My4wLjAuMA..#sec-let-and-const-declarations-static-semantics-early-errors" rel="noopener noreferrer"&gt;14.3.1.1 'Static Semantics: Early Errors&lt;/a&gt;,' which explains other essential aspects of variables defined with the &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; keywords.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;LexicalDeclaration&lt;/em&gt;: &lt;em&gt;LetOrConst&lt;/em&gt; &lt;em&gt;BindingList&lt;/em&gt;;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is a &lt;code&gt;Syntax Error&lt;/code&gt; if the &lt;code&gt;BoundNames&lt;/code&gt; of &lt;code&gt;BindingList&lt;/code&gt; contains "let".&lt;/li&gt;
&lt;li&gt;It is a &lt;code&gt;Syntax Error&lt;/code&gt; if the &lt;code&gt;BoundNames&lt;/code&gt; of &lt;code&gt;BindingList&lt;/code&gt; contains any duplicate entries.
&lt;em&gt;LexicalBinding&lt;/em&gt; : &lt;em&gt;BindingIdentifier&lt;/em&gt; &lt;em&gt;Initializer&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;It is a &lt;code&gt;Syntax Error&lt;/code&gt; if &lt;code&gt;Initializer&lt;/code&gt; is not present and &lt;code&gt;IsConstantDeclaration&lt;/code&gt; of the &lt;code&gt;LexicalDeclaration&lt;/code&gt; containing this &lt;code&gt;LexicalBinding&lt;/code&gt; is true.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;LetOrConst&lt;/em&gt; is a grammar rule which specifies that variable declarations can start with the &lt;code&gt;let&lt;/code&gt; or &lt;code&gt;const&lt;/code&gt; keywords. &lt;br&gt;
&lt;em&gt;BindingList&lt;/em&gt; is a list of variables declared with &lt;code&gt;let&lt;/code&gt; or &lt;code&gt;const&lt;/code&gt; keywords. We could imagine &lt;em&gt;BindingList&lt;/em&gt; as a data structure like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="nx"&gt;BindingList&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;e&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;A &lt;code&gt;Syntax Error&lt;/code&gt; is an error that breaks the language's grammatical rules. They occur before the code's execution. Let's analyse the first &lt;code&gt;Syntax Error&lt;/code&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;It is a &lt;code&gt;Syntax Error&lt;/code&gt; if the &lt;code&gt;BoundNames&lt;/code&gt; of &lt;code&gt;BindingList&lt;/code&gt; contains "let".&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;code&gt;BoundNames&lt;/code&gt; of &lt;code&gt;BindingList&lt;/code&gt; are the names of variables declared with let or const keywords.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="nx"&gt;BoundNames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;e&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A Syntax Error will occur when the &lt;code&gt;BoundNames&lt;/code&gt; list contains “let”.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;// SyntaxError: let is disallowed as a lexically bound name&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;// SyntaxError: let is disallowed as a lexically bound name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;It is a &lt;code&gt;Syntax Error&lt;/code&gt; if the &lt;code&gt;BoundNames&lt;/code&gt; of &lt;code&gt;BindingList&lt;/code&gt; contains any duplicate entries.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;It means we can't use the same names for variables declared with the &lt;code&gt;let&lt;/code&gt; or &lt;code&gt;const&lt;/code&gt; keywords if they are already used in that scope.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="c1"&gt;// SyntaxError: Identifier 'a' has already been declared&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;It is a &lt;code&gt;Syntax Error&lt;/code&gt; if &lt;code&gt;Initializer&lt;/code&gt; is not present and &lt;code&gt;IsConstantDeclaration&lt;/code&gt; of the &lt;code&gt;LexicalDeclaration&lt;/code&gt; containing this &lt;code&gt;LexicalBinding&lt;/code&gt; is true.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;IsConstantDeclaration&lt;/code&gt; is an abstract operation in the standard that checks if the variable is declared with the &lt;code&gt;const&lt;/code&gt; keyword. This rule could be decrypted like that:  if &lt;code&gt;IsConstantDeclaration&lt;/code&gt; is &lt;code&gt;true&lt;/code&gt; and the variable doesn't have an &lt;code&gt;Initializer&lt;/code&gt;, a &lt;code&gt;Syntax Error&lt;/code&gt; will be returned.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// SyntaxError: Missing initializer in const declaration&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another vital thing only related to the &lt;code&gt;const&lt;/code&gt; keyword: variables declared with the &lt;code&gt;const&lt;/code&gt; keyword can't be reassigned. It is not stated explicitly in the standard, but we can get it from the &lt;code&gt;IsConstantDeclaration&lt;/code&gt; operation and the syntax rule that variables declared with the &lt;code&gt;const&lt;/code&gt; keyword should always be initialised with the &lt;code&gt;Initializer&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;46&lt;/span&gt; &lt;span class="c1"&gt;// TypeError: Assignment to constant variable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Variable Statement
&lt;/h2&gt;

&lt;p&gt;Before 2015, when the ECMAScript 2015 wasn't released yet, only the &lt;code&gt;var&lt;/code&gt; keyword was available to create a variable in JavaScript.&lt;/p&gt;

&lt;p&gt;In the paragraph &lt;a href="https://262.ecma-international.org/15.0/index.html?_gl=1*hea1h0*_ga*MTI0NjkxODY1MC4xNzIxOTMxODM0*_ga_TDCK4DWEPP*MTcyMTkzMTgzMy4xLjEuMTcyMTkzMjE1My4wLjAuMA..#sec-variable-statement" rel="noopener noreferrer"&gt;14.3.2 Variable Statement&lt;/a&gt; of ECMAScript standard the following is stated:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A var statement declares variables scoped to the running &lt;code&gt;execution context&lt;/code&gt;'s &lt;code&gt;VariableEnvironment&lt;/code&gt;. &lt;code&gt;Var&lt;/code&gt; variables are created when their containing &lt;code&gt;Environment Record&lt;/code&gt; is instantiated and are initialized to undefined when created. Within the scope of any &lt;code&gt;VariableEnvironment&lt;/code&gt; a common &lt;code&gt;BindingIdentifier&lt;/code&gt; may appear in more than one &lt;code&gt;VariableDeclaration&lt;/code&gt; but those declarations collectively define only one variable. A variable defined by a &lt;code&gt;VariableDeclaration&lt;/code&gt; with an &lt;code&gt;Initializer&lt;/code&gt; is assigned the value of its &lt;code&gt;Initializer&lt;/code&gt;'s &lt;code&gt;AssignmentExpression&lt;/code&gt; when the &lt;code&gt;VariableDeclaration&lt;/code&gt; is executed, not when the variable is created.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I again explain it sentence by sentence.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A var statement declares variables scoped to the running &lt;code&gt;execution context&lt;/code&gt;'s &lt;code&gt;VariableEnvironment&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This means that variables declared with the &lt;code&gt;var&lt;/code&gt; keyword are either function-scoped if declared inside a function or global-scoped if declared outside any function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;globalVariable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is a global variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;globalVariable&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// This is a global variable&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;outerFunction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Outer Function Execution Context&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;outerVariable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is an outer variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;outerFunction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Global Execution Context&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;condition&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;globalVariable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is a global variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;outerFunction&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Function&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Outer Function Execution Context&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;outerVariable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is an outer variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="nx"&gt;Global&lt;/span&gt; &lt;span class="nx"&gt;Execution&lt;/span&gt; &lt;span class="nx"&gt;Context&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Var&lt;/code&gt; variables are created when their containing &lt;code&gt;Environment Record&lt;/code&gt; is instantiated and are initialized to undefined when created.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;During the &lt;strong&gt;Creation Phase&lt;/strong&gt; of the &lt;code&gt;Execution Context&lt;/code&gt; variables are assigned the &lt;code&gt;undefined&lt;/code&gt; value. The process of assigning the &lt;code&gt;undefined&lt;/code&gt; to a variable during the &lt;strong&gt;Creation Phase&lt;/strong&gt; is often referred to as &lt;strong&gt;"hoisting"&lt;/strong&gt; or &lt;strong&gt;declaration hoisting&lt;/strong&gt;. It is worth mentioning that the terms &lt;strong&gt;"hoisting"&lt;/strong&gt; or &lt;strong&gt;declaration hoisting&lt;/strong&gt; are not included in the standard. However, it is a convention used by many developers to explain the availability of variables "before" they were declared.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;globalVariable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// undefined&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;globalVariable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This is a global variable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="c1"&gt;// Global Execution Context Creation Phase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;globalVariable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sometimes, it is explained that the code example above is possible because variables declared with the &lt;code&gt;var&lt;/code&gt; keyword are "moved" to the top of the scope. However, nothing is moved anywhere; it is only possible by assigning the &lt;code&gt;undefined&lt;/code&gt; value to the variable during the &lt;strong&gt;Creation Phase&lt;/strong&gt; of &lt;code&gt;Execution Context&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Within the scope of any &lt;code&gt;VariableEnvironment&lt;/code&gt; a common &lt;code&gt;BindingIdentifier&lt;/code&gt; may appear in more than one &lt;code&gt;VariableDeclaration&lt;/code&gt; but those declarations collectively define only one variable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;BindingIdentifier&lt;/code&gt; is a more specific type of the &lt;code&gt;Identifier&lt;/code&gt;. We used the &lt;code&gt;Identifier&lt;/code&gt; term before to explain the name of a variable. While &lt;code&gt;Identifier&lt;/code&gt; also refers to the variable's name, &lt;code&gt;BindingIdentifier&lt;/code&gt; is only used in the context of the declaration of variables (function or other data structure).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="c1"&gt;// BindingIdentifier&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;// Identifier&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let's go back to explaining the sentence's meaning.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;BindingIdentifier&lt;/code&gt; may appear in more than one &lt;code&gt;VariableDeclaration&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the same scope, we can create multiple variables with the same name using the &lt;code&gt;var&lt;/code&gt; keyword, whilst all these "variables" reference only one variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;66&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;

&lt;span class="c1"&gt;// Execution context&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;variable &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2015&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It may appear we declared three variables with the &lt;code&gt;BindingIdentifier&lt;/code&gt; &lt;code&gt;variable&lt;/code&gt;, but we just reassigned the original variable &lt;code&gt;variable&lt;/code&gt; twice. First, we reassigned it from &lt;code&gt;42&lt;/code&gt; to &lt;code&gt;66&lt;/code&gt;, then from &lt;code&gt;66&lt;/code&gt; to &lt;code&gt;2015&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A variable defined by a &lt;code&gt;VariableDeclaration&lt;/code&gt; with an &lt;code&gt;Initializer&lt;/code&gt; is assigned the value of its &lt;code&gt;Initializer&lt;/code&gt;'s &lt;code&gt;AssignmentExpression&lt;/code&gt; when the &lt;code&gt;VariableDeclaration&lt;/code&gt; is executed, not when the variable is created.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The variable's value (&lt;code&gt;Initializer&lt;/code&gt;) is assigned to it during the &lt;strong&gt;Execution Phase&lt;/strong&gt;, not the &lt;code&gt;Creation Phase&lt;/code&gt; of the &lt;code&gt;Execution Context&lt;/code&gt;. Variables declared with the &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; keywords behave identically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;

&lt;span class="c1"&gt;// Global Execution Context Creation Phase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;variable&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Global Execution Context Execution Phase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Environment Record&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;variable&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="nx"&gt;OuterEnv&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Diffrences
&lt;/h2&gt;

&lt;p&gt;To sum up the article, I would like to highlight the following differences:&lt;/p&gt;

&lt;h3&gt;
  
  
  Scope
&lt;/h3&gt;

&lt;p&gt;The first difference between variables created with &lt;code&gt;var&lt;/code&gt;, &lt;code&gt;let&lt;/code&gt;, and &lt;code&gt;const&lt;/code&gt; keywords is how they are scoped. Variables created with &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; are scoped to the &lt;code&gt;LexicalEnvironment&lt;/code&gt;, meaning they are available in the &lt;code&gt;Environment Record&lt;/code&gt; of a block, function, or the &lt;code&gt;Global Execution Context&lt;/code&gt;. In contrast, variables created with &lt;code&gt;var&lt;/code&gt; are scoped to the &lt;code&gt;VariableEnvironment&lt;/code&gt;, meaning they are only available in the &lt;code&gt;Environment Record&lt;/code&gt; of a function or the &lt;code&gt;Global Execution Context&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creation Phase of the Execution Context
&lt;/h3&gt;

&lt;p&gt;During the &lt;code&gt;Execution Context&lt;/code&gt;'s &lt;strong&gt;Creation Phase&lt;/strong&gt;, variables created with &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; are &lt;code&gt;uninitialised&lt;/code&gt;, whilst &lt;code&gt;var&lt;/code&gt; variables are assigned the &lt;code&gt;undefined&lt;/code&gt; value. The state of &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; being &lt;code&gt;uninitialised&lt;/code&gt; is sometimes referenced as a &lt;strong&gt;Temporal Dead Zone or TDZ&lt;/strong&gt;. Also, the behaviour of &lt;code&gt;var&lt;/code&gt; being assigned the &lt;code&gt;undefined&lt;/code&gt; value is usually known as &lt;strong&gt;“hoisting”&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Default &lt;code&gt;Initializer&lt;/code&gt; value
&lt;/h3&gt;

&lt;p&gt;Variables created with &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;var&lt;/code&gt; keywords are assigned the &lt;code&gt;undefined&lt;/code&gt; value if &lt;code&gt;Initializer&lt;/code&gt; is not provided. Meanwhile, &lt;code&gt;const&lt;/code&gt; variables must always have &lt;code&gt;Initializer&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variables naming
&lt;/h3&gt;

&lt;p&gt;Variables created with the &lt;code&gt;var&lt;/code&gt; keyword can have duplicate names since they all reference the same variable. However, &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;const&lt;/code&gt; variables can't have duplicate names — doing so results in a &lt;code&gt;Syntax Error&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variables &lt;code&gt;Initializer&lt;/code&gt; reassignment
&lt;/h3&gt;

&lt;p&gt;Variables created with &lt;code&gt;let&lt;/code&gt; and &lt;code&gt;var&lt;/code&gt; keywords can reassign their initial &lt;code&gt;Initializer&lt;/code&gt; (value) to a different one. But, &lt;code&gt;const&lt;/code&gt; variables can't have their &lt;code&gt;Initializer&lt;/code&gt; reassigned.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>learning</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
