{"componentChunkName":"component---src-templates-post-js","path":"/blog/let-vs-var","result":{"data":{"markdownRemark":{"html":"<p class=\"intro\">Recently, I started taking a course <a href=\"https://es6.io\" target=\"_blank\" >ES6 For Everyone </a> by Wes Bos to brush up my ES6. I will be posting about ES6 as I go through the course.\n</p>\n<p>Today, I am going to talk about <code class=\"language-text\">let</code>, <code class=\"language-text\">const</code> and <code class=\"language-text\">var</code>. Before ES6, we only had <code class=\"language-text\">var</code> and variables declared using <code class=\"language-text\">var</code> are function scoped. Let's see an example:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">function</span> <span class=\"token function\">setHeight</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> height <span class=\"token operator\">=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>height<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">setHeight</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// logs 100</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>height<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// gives a Reference Error saying height is not defined</span></code></pre></div>\n<p>Above, we can see that variables declared with <code class=\"language-text\">var</code> inside a function cannot be used outside a function. But what if I declare a variable inside a block (say if block).</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">var</span> age <span class=\"token operator\">=</span> <span class=\"token number\">50</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">></span> <span class=\"token number\">12</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> dogYears <span class=\"token operator\">=</span> age <span class=\"token operator\">*</span> <span class=\"token number\">7</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">You are </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>dogYears<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> dog years old!</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>dogYears<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// logs 350!!!</span></code></pre></div>\n<p>So, variables declared with <code class=\"language-text\">var</code> inside a block can be accessed outside the block. The <code class=\"language-text\">dogYears</code> variable is not needed outside the <code class=\"language-text\">if</code> block and it should not be accessible outside it. To solve this problem, we can use either <code class=\"language-text\">let</code> or <code class=\"language-text\">const</code>.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">var</span> age <span class=\"token operator\">=</span> <span class=\"token number\">50</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>age <span class=\"token operator\">></span> <span class=\"token number\">12</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">let</span> dogYears <span class=\"token operator\">=</span> age <span class=\"token operator\">*</span> <span class=\"token number\">7</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// notice the 'let'</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">You are </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>dogYears<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\"> dog years old!</span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>dogYears<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// ReferenceError: dogYears is not defined</span></code></pre></div>\n<p>We can see that variables declared by <code class=\"language-text\">let</code> and <code class=\"language-text\">const</code> are block scoped. The only difference between <code class=\"language-text\">let</code> and <code class=\"language-text\">const</code> is that variables declared with <code class=\"language-text\">const</code> cannot be reassigned.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> person <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  name<span class=\"token operator\">:</span> <span class=\"token string\">'Anku'</span><span class=\"token punctuation\">,</span>\n  age<span class=\"token operator\">:</span> <span class=\"token number\">100</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Reassigning is allowed with 'let'</span>\nperson <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  name<span class=\"token operator\">:</span> <span class=\"token string\">'Elliot'</span><span class=\"token punctuation\">,</span>\n  age<span class=\"token operator\">:</span> <span class=\"token number\">36</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> rectangle <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  height<span class=\"token operator\">:</span> <span class=\"token number\">10</span><span class=\"token punctuation\">,</span>\n  width<span class=\"token operator\">:</span> <span class=\"token number\">20</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Reassigning is not allowed with 'const'</span>\n<span class=\"token comment\">// It will give an error</span>\nrectangle <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  height<span class=\"token operator\">:</span> <span class=\"token number\">40</span><span class=\"token punctuation\">,</span>\n  width<span class=\"token operator\">:</span> <span class=\"token number\">100</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Although, variables declared with <code class=\"language-text\">const</code> cannot be reassigned but their properties can be changed. In other words, they are mutable.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">const</span> arr <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [1, 2, 3]</span>\n\narr<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// [100, 2, 3]</span></code></pre></div>\n<h3>var inside a for loop</h3>\n<p>We often run into problems when using a for loop with <code class=\"language-text\">var</code>. Let's start with simple code.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// logs from 1 to 9</span>\n<span class=\"token punctuation\">}</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// logs 10</span></code></pre></div>\n<p>Above, we encounter the same variable 'leaking' problem. <code class=\"language-text\">i</code> can be accessed outside the <code class=\"language-text\">for</code> loop. We can fix this using <code class=\"language-text\">let</code> instead of <code class=\"language-text\">var</code>. If you think that this was not a big deal then you have not run into a situation where you have to call an asynchronous function inside a for loop. Let's see an example with <code class=\"language-text\">setTimeout</code> function.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'The value of i is '</span> <span class=\"token operator\">+</span> i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// runs after a second.</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Prints</span>\n<span class=\"token comment\">// 'The value of i is 10'</span>\n<span class=\"token comment\">// 10 times</span></code></pre></div>\n<p>This is not what we wanted. We had called <code class=\"language-text\">setTimeout</code> with different values of <code class=\"language-text\">i</code> so it must have printed different values. If we change <code class=\"language-text\">var</code> to <code class=\"language-text\">let</code>, we will get the desired result.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">let</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">setTimeout</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token string\">'The value of i is '</span> <span class=\"token operator\">+</span> i<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// runs after a second.</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Prints</span>\n<span class=\"token comment\">// The value of i is 0</span>\n<span class=\"token comment\">// The value of i is 1</span>\n<span class=\"token comment\">// The value of i is 2 and so on</span></code></pre></div>\n<h3>Temporal Dead Zone</h3>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// age is not declared yet, but it won't give us an error.</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>age<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// prints 'undefined'</span>\n\n<span class=\"token keyword\">var</span> age <span class=\"token operator\">=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// same behaviour as</span>\n<span class=\"token keyword\">let</span> height<span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>height<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// undefined</span></code></pre></div>\n<p>Variables declared with <code class=\"language-text\">var</code> can be accessed even before they are declared. But, what happens when doing the same with <code class=\"language-text\">let</code>?</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>age<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Ref Error: age is not defined</span>\n<span class=\"token keyword\">let</span> age <span class=\"token operator\">=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Variables declared with <code class=\"language-text\">let</code> and <code class=\"language-text\">const</code> cannot be accessed before their declaration.This is called Temporal Dead Zone.</p>\n<p>Now, that we know about <code class=\"language-text\">let</code>, <code class=\"language-text\">const</code>, and <code class=\"language-text\">var</code>, what should we use? Well, that does depend on your personal choice but I like to use <code class=\"language-text\">const</code> by default and when I need to reassign variables I use <code class=\"language-text\">let</code>. <code class=\"language-text\">var</code> should not be used in ES6.</p>\n<p>This is it for this post. Thanks for reading. I will post more about ES6 in future.</p>","timeToRead":3,"frontmatter":{"title":"let, const and var in Javascript","date":"2017-12-14T00:00:00.000Z","tags":["Javascript"]}}},"pageContext":{"slug":"let-vs-var"}},"staticQueryHashes":["3649515864","63159454"]}