{"componentChunkName":"component---src-templates-post-js","path":"/blog/this-in-js","result":{"data":{"markdownRemark":{"html":"<p class=\"intro\">I have only posted about CSS/Flexbox as of now. Today, I decided to post about Javascript and explaining <code>this keyword</code> is the best way to start.</p>\n<p>I have taken Colt Steel's <a href=\"https://www.udemy.com/the-web-developer-bootcamp/\" target=\"_blank\">Web Developer Bootcamp</a>. In that course, Elie has explained <code class=\"language-text\">this keyword</code> pretty well. I am going to use his method or his rules to explain <code class=\"language-text\">this keyword</code> here.</p>\n<p>Let us start by asking what <code class=\"language-text\">this keyword</code> really is? Well, <code class=\"language-text\">this</code> is a reserved keyword in javascript whose value gives the context of the current scope. Its value can be determined using four rules (global, object/implicit, explicit, new).</p>\n<h3>1 - Global Context</h3>\n<blockquote>\n<p>When <code class=\"language-text\">this</code> is not inside a declared object, it's value is the <code class=\"language-text\">window</code> object.</p>\n</blockquote>\n<p>Let's take a look at below code sample to understand this:</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><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// window</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">whatIsThis</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</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><span class=\"token function\">whatIsThis</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// window</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">workingWithThis</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// since the value of this is window here</span>\n  <span class=\"token comment\">// person will be a global variable attached to window object</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>person <span class=\"token operator\">=</span> <span class=\"token string\">'Anku'</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">workingWithThis</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>person<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Anku</span></code></pre></div>\n<h3>2 - Implict/Object</h3>\n<blockquote>\n<p>When the <code class=\"language-text\">this keyword</code> is inside a declared object, it's value will always be it's closest parent object.</p>\n</blockquote>\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  firstName<span class=\"token operator\">:</span> <span class=\"token string\">'Anku'</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function-variable function\">sayHi</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token string\">'Hi! '</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>firstName<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function-variable function\">determineContext</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span> <span class=\"token operator\">===</span> person<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\nperson<span class=\"token punctuation\">.</span><span class=\"token function\">sayHi</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Hi! Anku</span>\nperson<span class=\"token punctuation\">.</span><span class=\"token function\">determineContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span></code></pre></div>\n<p>Inside <code class=\"language-text\">sayHi</code> and <code class=\"language-text\">determineContext</code> functions we used <code class=\"language-text\">this</code> and its value was its closest parent object (person object). So far so good right? Let us have a look at nested objects.</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  firstName<span class=\"token operator\">:</span> <span class=\"token string\">'Anku'</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function-variable function\">sayHi</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token string\">'Hi! '</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>firstName<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function-variable function\">determineContext</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span> <span class=\"token operator\">===</span> person<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token comment\">// Hey look! An object inside an object</span>\n  dog<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function-variable function\">sayHello</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token string\">'Hello! '</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>firstName<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n    <span class=\"token function-variable function\">determineContext</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span> <span class=\"token operator\">===</span> person<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\nperson<span class=\"token punctuation\">.</span><span class=\"token function\">sayHi</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Hi! Anku</span>\nperson<span class=\"token punctuation\">.</span><span class=\"token function\">determineContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span>\n\nperson<span class=\"token punctuation\">.</span>dog<span class=\"token punctuation\">.</span><span class=\"token function\">sayHello</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Hello! undefined</span>\nperson<span class=\"token punctuation\">.</span>dog<span class=\"token punctuation\">.</span><span class=\"token function\">determineContext</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// false</span></code></pre></div>\n<p>The context or the value of <code class=\"language-text\">this</code> inside the <code class=\"language-text\">sayHello</code> function object was it's closest parent object i.e. <code class=\"language-text\">dog</code> object. The <code class=\"language-text\">dog</code> object doesn't have any <code class=\"language-text\">firstName</code> property. Hence, it returned <code class=\"language-text\">undefined</code>. <code class=\"language-text\">determineContext</code> inside dog object also returned false because the value of <code class=\"language-text\">this</code> was <code class=\"language-text\">dog</code> and not <code class=\"language-text\">person</code>.</p>\n<h3>3 - Explicit Binding</h3>\n<blockquote>\n<p>Choose what we want the context of <code class=\"language-text\">this</code> to be using <code class=\"language-text\">call</code>, <code class=\"language-text\">apply</code>, and <code class=\"language-text\">bind</code>.</p>\n</blockquote>\n<p>We can set/change the value of this inside any function by using <code class=\"language-text\">call</code>, <code class=\"language-text\">apply</code>, and <code class=\"language-text\">bind</code> methods. The table given below gives us more information about these methods.</p>\n<table>\n<thead>\n<tr>\n<th align=\"center\"><strong>Name of Methods</strong></th>\n<th align=\"center\"><strong>Parameters</strong></th>\n<th align=\"center\"><strong>Invoke Immediately</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"center\">Call</td>\n<td align=\"center\">thisArg, a, b, c, ...</td>\n<td align=\"center\">Yes</td>\n</tr>\n<tr>\n<td align=\"center\">Apply</td>\n<td align=\"center\">thisArg, [a,b,c, ...]</td>\n<td align=\"center\">Yes</td>\n</tr>\n<tr>\n<td align=\"center\">Bind</td>\n<td align=\"center\">thisArg, a, b, c, ...</td>\n<td align=\"center\">No</td>\n</tr>\n</tbody>\n</table>\n<h4>Working with call</h4>\n<p>The call method takes the value of <code class=\"language-text\">this</code> and an infinite number of optional arguments. Above, when we called <code class=\"language-text\">sayHello</code> function inside <code class=\"language-text\">dog</code> object, it returned <code class=\"language-text\">Hello! undefined</code>. I want to change the value of <code class=\"language-text\">this</code> inside <code class=\"language-text\">dog</code> object to the <code class=\"language-text\">person</code> object and call the function.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token comment\">// I am passing person as the arugment to call</span>\nperson<span class=\"token punctuation\">.</span>dog<span class=\"token punctuation\">.</span><span class=\"token function\">sayHello</span><span class=\"token punctuation\">.</span><span class=\"token function\">call</span><span class=\"token punctuation\">(</span>person<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Hello! Anku</span>\nperson<span class=\"token punctuation\">.</span>dog<span class=\"token punctuation\">.</span><span class=\"token function\">determineContext</span><span class=\"token punctuation\">.</span><span class=\"token function\">call</span><span class=\"token punctuation\">(</span>person<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// true</span></code></pre></div>\n<p>Now, when we ask the value <code class=\"language-text\">this.firstName</code> inside <code class=\"language-text\">dog</code> object, it refers to the <code class=\"language-text\">person.firstName</code> and hence we get <code class=\"language-text\">Hello! Anku</code> as the output.</p>\n<h4>Working with apply</h4>\n<p>The <code class=\"language-text\">apply</code> method is exactly similar to <code class=\"language-text\">call</code> except that it only takes two arguments. First the value of <code class=\"language-text\">this</code> and second, a list of optional arguments. The <code class=\"language-text\">apply</code> method like <code class=\"language-text\">call</code> method invokes the function immediately.</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> Anku <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  firstName<span class=\"token operator\">:</span> <span class=\"token string\">'Anku'</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function-variable function\">addNumbers</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> c<span class=\"token punctuation\">,</span> d</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> <span class=\"token string\">' just calculated '</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span>a <span class=\"token operator\">+</span> b <span class=\"token operator\">+</span> c <span class=\"token operator\">+</span> d<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> Nikhil <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  firstName<span class=\"token operator\">:</span> <span class=\"token string\">'Nikhil'</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\nAnku<span class=\"token punctuation\">.</span><span class=\"token function\">addNumbers</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 number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nAnku<span class=\"token punctuation\">.</span><span class=\"token function\">addNumbers</span><span class=\"token punctuation\">.</span><span class=\"token function\">call</span><span class=\"token punctuation\">(</span>Nikhil<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 number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nAnku<span class=\"token punctuation\">.</span><span class=\"token function\">addNumbers</span><span class=\"token punctuation\">.</span><span class=\"token function\">apply</span><span class=\"token punctuation\">(</span>Nikhil<span class=\"token punctuation\">,</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 number\">4</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>The difference between <code class=\"language-text\">call</code> and <code class=\"language-text\">apply</code> is obvious in above example. Also, notice how <code class=\"language-text\">call</code> and <code class=\"language-text\">apply</code> are changing the value of <code class=\"language-text\">this</code> to <code class=\"language-text\">Nikhil</code> in last two lines.</p>\n<h4>Working with bind</h4>\n<p>In <code class=\"language-text\">bind</code> parameters work just like the <code class=\"language-text\">call</code> but it returns a function with the context of <code class=\"language-text\">this</code> bound already! Let us have a look at the code example given below:</p>\n<div class=\"gatsby-highlight\" data-language=\"js\"><pre class=\"language-js\"><code class=\"language-js\"><span class=\"token keyword\">let</span> Anku <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  firstName<span class=\"token operator\">:</span> <span class=\"token string\">'Anku'</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function-variable function\">addNumbers</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> c<span class=\"token punctuation\">,</span> d</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">+</span> <span class=\"token string\">' just calculated '</span> <span class=\"token operator\">+</span> <span class=\"token punctuation\">(</span>a <span class=\"token operator\">+</span> b <span class=\"token operator\">+</span> c <span class=\"token operator\">+</span> d<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">let</span> Nikhil <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  firstName<span class=\"token operator\">:</span> <span class=\"token string\">'Nikhil'</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">// Storing the returned function in NikhilCalc</span>\n<span class=\"token keyword\">let</span> NikhilCalc <span class=\"token operator\">=</span> Anku<span class=\"token punctuation\">.</span><span class=\"token function\">addNumbers</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span>Nikhil<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 number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// Calling NikhilCalc</span>\n<span class=\"token function\">NikhilCalc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><code class=\"language-text\">bind</code> does not invoke the function immediately but rather returns a new function with passed context. We can then call the function later in our code.</p>\n<h4>4 - The new keyword</h4>\n<blockquote>\n<p>The <code class=\"language-text\">new</code> keyword is used for the function and inside the function definition the keyword <code class=\"language-text\">this</code> refers to the new object that is created.</p>\n</blockquote>\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\">Person</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">firstName<span class=\"token punctuation\">,</span> lastName</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>firstName <span class=\"token operator\">=</span> firstName<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>lastName <span class=\"token operator\">=</span> lastName<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">let</span> Nikhil <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Person</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Nikhil'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'Jha'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Nikhil<span class=\"token punctuation\">.</span>lastName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Jha</span></code></pre></div>\n<p>If you only consider the function <code class=\"language-text\">Person</code> then <code class=\"language-text\">this</code> keyword inside it refers to the <code class=\"language-text\">window</code> object but when a function is called in conjunction with the <code class=\"language-text\">new</code> keyword, <code class=\"language-text\">this</code> inside the function refers to the object that is created. <code class=\"language-text\">Person</code> function is also called constructor function in OOP.</p>\n<p>This seems like a lot of rules but after some practice, you won't need any rule to determine the value of <code class=\"language-text\">this</code>. It becomes obvious.</p>","timeToRead":5,"frontmatter":{"title":"this keyword in Javascript","date":"2017-10-28T00:00:00.000Z","tags":["Javascript"]}}},"pageContext":{"slug":"this-in-js"}},"staticQueryHashes":["3649515864","63159454"]}