<?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: mohit kushwaha</title>
    <description>The latest articles on DEV Community by mohit kushwaha (@mohitcodes).</description>
    <link>https://dev.to/mohitcodes</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%2F708360%2F66fa8308-0d60-45ed-a2cb-2d12dc401c62.jpg</url>
      <title>DEV Community: mohit kushwaha</title>
      <link>https://dev.to/mohitcodes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohitcodes"/>
    <language>en</language>
    <item>
      <title>The mystery of “this” in JavaScript.</title>
      <dc:creator>mohit kushwaha</dc:creator>
      <pubDate>Sat, 01 Apr 2023 11:06:30 +0000</pubDate>
      <link>https://dev.to/mohitcodes/the-mystery-of-this-in-javascript-19b6</link>
      <guid>https://dev.to/mohitcodes/the-mystery-of-this-in-javascript-19b6</guid>
      <description>&lt;blockquote&gt;
&lt;h1 id="heading-javascript-like-a-box-of-gems"&gt;JavaScript, like a box of gems&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you are into JavaScript, then you cannot deny the fact that &lt;em&gt;this&lt;/em&gt; keyword is very confusing 🤨 when you are writing code, especially when you read others’ code.&lt;/p&gt;

&lt;p&gt;In this blog, we will understand how to use &lt;em&gt;this&lt;/em&gt; correctly ✔️ and also the scenarios where it is most misunderstood. &lt;/p&gt;

&lt;p&gt;In the previous  &lt;a href="https://mohit-codes.hashnode.dev/differences-between-arrow-function-and-regular-function-in-javascript"&gt;blog post&lt;/a&gt;, I mentioned that function invocations in JavaScript can be split into 4 types :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;function invocation&lt;/li&gt;
&lt;li&gt;method invocation&lt;/li&gt;
&lt;li&gt;constructor invocation&lt;/li&gt;
&lt;li&gt;indirect invocation  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each function invocation defines its context differently.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The key to understanding this keyword is to understand how function invocation affects the context.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's become familiar with some terms before getting started :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Invocation&lt;/strong&gt; - Invoking a function means running the code that makes up its body, or simply calling it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context&lt;/strong&gt; - The value of &lt;em&gt;this&lt;/em&gt; within function body.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope&lt;/strong&gt; - A function's scope is the set of variables and functions it can access.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="heading-1-function-invocation"&gt;1. Function Invocation&lt;/h2&gt;

&lt;p&gt;A function invocation occurs when an expression that evaluates to a function object is followed by an open parenthesis (, a comma separated list of arguments expressions, and a close parenthesis).&lt;/p&gt;

&lt;p&gt;Here is a simple example of function invocation:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;square&lt;/span&gt;(&lt;span&gt;x&lt;/span&gt;)&lt;/span&gt;{&lt;br&gt;
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; x&lt;span class="hljs-operator"&gt;*&lt;/span&gt;x;&lt;br&gt;
}&lt;br&gt;
&lt;span class="hljs-comment"&gt;// Function invocation&lt;/span&gt;&lt;br&gt;
square(&lt;span class="hljs-number"&gt;5&lt;/span&gt;);&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;square(5)&lt;/code&gt; is a function invocation, &lt;code&gt;square&lt;/code&gt; evaluates to a function object, followed by a pair of parentheses and the argument 5.&lt;/p&gt;

&lt;p&gt;Remember the distinction between function invocation and method invocation. For example, &lt;code&gt;['a','b'].join('')&lt;/code&gt; is not a function invocation, but a method invocation.&lt;/p&gt;

&lt;h3 id="heading-11-this-in-a-function-invocation"&gt;1.1 this in a function invocation&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;In a function invocation, this refers to the global object.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The global object is determined by the execution environment. The window object is the global object in a browser.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;square&lt;/span&gt;(&lt;span&gt;x&lt;/span&gt;)&lt;/span&gt;{&lt;br&gt;
    console.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt;);  &lt;span class="hljs-comment"&gt;// same window object&lt;/span&gt;&lt;br&gt;
    console.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt; window);  &lt;span class="hljs-comment"&gt;// true&lt;/span&gt;&lt;br&gt;
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; x&lt;span class="hljs-operator"&gt;*&lt;/span&gt;x;&lt;br&gt;
}&lt;br&gt;
&lt;span class="hljs-comment"&gt;// Function invocation&lt;/span&gt;&lt;br&gt;
square(&lt;span class="hljs-number"&gt;5&lt;/span&gt;);&lt;br&gt;
console.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt; , &lt;span class="hljs-built_in"&gt;this&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt; window); &lt;span class="hljs-comment"&gt;// logs window object and true&lt;/span&gt;&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In NodeJS, &lt;em&gt;this&lt;/em&gt; is the current &lt;code&gt;module.exports&lt;/code&gt; object, not the global object, but inside a function, &lt;em&gt;this&lt;/em&gt; will point to the global object, or we can use the global keyword to access it.&lt;/p&gt;
&lt;br&gt;
&lt;pre&gt;&lt;code&gt;console.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt;);    &lt;span class="hljs-comment"&gt;// logs {}&lt;/span&gt;

&lt;p&gt;module.exports.num &lt;span&gt;=&lt;/span&gt; &lt;span&gt;5&lt;/span&gt;;&lt;/p&gt;

&lt;p&gt;console.log(&lt;span&gt;this&lt;/span&gt;);   &lt;span&gt;// logs { num:5 }&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;square&lt;/span&gt;(&lt;span&gt;x&lt;/span&gt;)&lt;/span&gt;{&lt;br&gt;
  console.log(&lt;span&gt;this&lt;/span&gt;,&lt;span&gt;this&lt;/span&gt; &lt;span&gt;=&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;=&lt;/span&gt; global);    &lt;span&gt;// logs global object and true&lt;/span&gt;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;console.log(global);  &lt;span&gt;// logs global object&lt;/span&gt;&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note: In strict mode,&lt;em&gt; this &lt;/em&gt;is undefined&lt;/p&gt;
&lt;br&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;square&lt;/span&gt;(&lt;span&gt;x&lt;/span&gt;)&lt;/span&gt;{&lt;br&gt;
&lt;span class="hljs-meta"&gt;    'use strict'&lt;/span&gt;;&lt;br&gt;
    &lt;span class="hljs-built_in"&gt;console&lt;/span&gt;.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt;);  &lt;span class="hljs-comment"&gt;// undefined&lt;/span&gt;&lt;br&gt;
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; x*x;&lt;br&gt;
}&lt;br&gt;
&lt;span class="hljs-comment"&gt;// Function invocation&lt;/span&gt;&lt;br&gt;
square(&lt;span class="hljs-number"&gt;5&lt;/span&gt;);&lt;br&gt;
&lt;span class="hljs-built_in"&gt;console&lt;/span&gt;.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt; , &lt;span class="hljs-built_in"&gt;this&lt;/span&gt; === &lt;span class="hljs-built_in"&gt;window&lt;/span&gt;); &lt;span class="hljs-comment"&gt;// logs window object and true&lt;/span&gt;&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="heading-12-this-in-inner-function"&gt;1.2 this in inner function&lt;/h3&gt;

&lt;p&gt; ❗️  An easy trap with function invocation is assuming that &lt;em&gt;this&lt;/em&gt; is the same in an inner function as in the outer function.&lt;/p&gt;

&lt;p&gt;✔️ The context of an inner function (except the arrow function) is entirely determined by its own invocation type, not by the context of the outer function.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;const car &lt;span class="hljs-operator"&gt;=&lt;/span&gt; {&lt;br&gt;
  distance: &lt;span class="hljs-number"&gt;200&lt;/span&gt;,&lt;br&gt;
  time: &lt;span class="hljs-number"&gt;2&lt;/span&gt;,&lt;br&gt;
  speed: &lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt;(&lt;span&gt;&lt;/span&gt;)&lt;/span&gt;{&lt;br&gt;
      console.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt; car) &lt;span class="hljs-comment"&gt;// true&lt;/span&gt;&lt;br&gt;
      console.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt;.distance &lt;span class="hljs-operator"&gt;/&lt;/span&gt; &lt;span class="hljs-built_in"&gt;this&lt;/span&gt;.time) &lt;span class="hljs-comment"&gt;// 100&lt;/span&gt;&lt;br&gt;
      &lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;calculate&lt;/span&gt;(&lt;span&gt;&lt;/span&gt;)&lt;/span&gt;{&lt;br&gt;
        console.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt;,&lt;span class="hljs-built_in"&gt;this&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt; window)  &lt;span class="hljs-comment"&gt;// window object and true&lt;/span&gt;&lt;br&gt;
        console.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt; car) &lt;span class="hljs-comment"&gt;// false&lt;/span&gt;&lt;br&gt;
      &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-built_in"&gt;this&lt;/span&gt;.distance &lt;span class="hljs-operator"&gt;/&lt;/span&gt; &lt;span class="hljs-built_in"&gt;this&lt;/span&gt;.time;  &lt;span class="hljs-comment"&gt;// error&lt;/span&gt;&lt;br&gt;
    }&lt;br&gt;
   &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; calculate(); &lt;span class="hljs-comment"&gt;// function invocation&lt;/span&gt;&lt;br&gt;
  }&lt;br&gt;
};&lt;br&gt;
car.speed();&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;car.speed()&lt;/code&gt; is a method invocation on an object thus &lt;em&gt;this&lt;/em&gt; equals car object. &lt;code&gt;calculate()&lt;/code&gt; function is defined inside &lt;code&gt;speed()&lt;/code&gt;, so you might expect to have &lt;em&gt;this&lt;/em&gt; as car object inside &lt;code&gt;calculate()&lt;/code&gt; too.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;calculate()&lt;/code&gt; is a function invocation, not method invocation, thus here this refers to the global object window or undefined in strict mode.&lt;/p&gt;

&lt;p&gt;Invocation of &lt;code&gt;car.speed()&lt;/code&gt; does not produce the expected result of 200 / 2 = 100.&lt;/p&gt;

&lt;p&gt;👍To solve the problem, &lt;code&gt;calculate()&lt;/code&gt; function must execute with the same context as the &lt;code&gt;car.speed()&lt;/code&gt; method, to access &lt;code&gt;this.distance&lt;/code&gt; and &lt;code&gt;this.time&lt;/code&gt; properties.&lt;/p&gt;

&lt;p&gt;One solution is to use &lt;code&gt;calculate.call(this)&lt;/code&gt; to manually set the context of inner function as same as that of outer, another much better solution is to use arrow function so that context of inner function is resolved lexically.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;const car &lt;span class="hljs-operator"&gt;=&lt;/span&gt; {&lt;br&gt;
  distance: &lt;span class="hljs-number"&gt;200&lt;/span&gt;,&lt;br&gt;
  time: &lt;span class="hljs-number"&gt;2&lt;/span&gt;,&lt;br&gt;
  speed: &lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt;(&lt;span&gt;&lt;/span&gt;)&lt;/span&gt;{&lt;br&gt;
      console.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt; car) &lt;span class="hljs-comment"&gt;// true&lt;/span&gt;&lt;br&gt;
      const calculate &lt;span class="hljs-operator"&gt;=&lt;/span&gt; () &lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;&amp;gt;&lt;/span&gt; {&lt;br&gt;
         console.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt; car)  &lt;span class="hljs-comment"&gt;// car object and true&lt;/span&gt;&lt;br&gt;
         &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-built_in"&gt;this&lt;/span&gt;.distance &lt;span class="hljs-operator"&gt;/&lt;/span&gt; &lt;span class="hljs-built_in"&gt;this&lt;/span&gt;.time; &lt;br&gt;
      }&lt;br&gt;
     &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; calculate();&lt;br&gt;
    }&lt;br&gt;
};&lt;br&gt;
car.speed();  &lt;span class="hljs-comment"&gt;// 100&lt;/span&gt;&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="heading-2-method-invocation"&gt;2. Method invocation&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;A &lt;strong&gt;method&lt;/strong&gt; is a function stored in an object's property.&lt;/p&gt;


&lt;/blockquote&gt;


&lt;pre&gt;&lt;code&gt;const greet &lt;span class="hljs-operator"&gt;=&lt;/span&gt;  {&lt;br&gt;
  english: &lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt;(&lt;span&gt;&lt;/span&gt;)&lt;/span&gt;{&lt;br&gt;
         console.log(&lt;span class="hljs-string"&gt;"Hello"&lt;/span&gt;);&lt;br&gt;
   },&lt;br&gt;
  hindi: &lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt;(&lt;span&gt;&lt;/span&gt;)&lt;/span&gt;{&lt;br&gt;
         console.log(&lt;span class="hljs-string"&gt;"Namaste"&lt;/span&gt;);&lt;br&gt;
   }&lt;br&gt;
};&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;english&lt;/code&gt; and &lt;code&gt;hindi&lt;/code&gt; are methods of the &lt;code&gt;greet&lt;/code&gt; object, and we can invoke these methods using the property accessors &lt;code&gt;greet.english()&lt;/code&gt; and &lt;code&gt;greet.hindi()&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id="heading-21-this-in-a-method-invocation"&gt;2.1 this in a method invocation&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;In a method invocation, this refers to the object that owns the method.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;pre&gt;&lt;code&gt;const greetUser &lt;span class="hljs-operator"&gt;=&lt;/span&gt; {&lt;br&gt;
    name: &lt;span class="hljs-string"&gt;"Dan"&lt;/span&gt;,&lt;br&gt;
    english: &lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt;(&lt;span&gt;&lt;/span&gt;) &lt;/span&gt;{&lt;br&gt;
        console.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt;&lt;span class="hljs-operator"&gt;=&lt;/span&gt; greetUser);   &lt;span class="hljs-comment"&gt;// true&lt;/span&gt;&lt;br&gt;
        console.log(&lt;span class="hljs-string"&gt;"Hello "&lt;/span&gt; &lt;span class="hljs-operator"&gt;+&lt;/span&gt; &lt;span class="hljs-built_in"&gt;this&lt;/span&gt;.&lt;span class="hljs-built_in"&gt;name&lt;/span&gt;);  &lt;span class="hljs-comment"&gt;// logs Hello Dan&lt;/span&gt;&lt;br&gt;
    },&lt;br&gt;
    hindi: &lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt;(&lt;span&gt;&lt;/span&gt;) &lt;/span&gt;{&lt;br&gt;
        console.log(&lt;span class="hljs-string"&gt;"Namaste "&lt;/span&gt; &lt;span class="hljs-operator"&gt;+&lt;/span&gt; &lt;span class="hljs-built_in"&gt;this&lt;/span&gt;.&lt;span class="hljs-built_in"&gt;name&lt;/span&gt;);&lt;br&gt;
    }&lt;br&gt;
};&lt;br&gt;
greetUser.engilsh();   &lt;span class="hljs-comment"&gt;// method invocation&lt;/span&gt;&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="heading-22-separating-method-from-the-object"&gt;2.2 separating method from the object&lt;/h3&gt;

&lt;p&gt;❗️ A method can be extracted from an object into a separate variable. when the detached method is invoked, you might expect &lt;em&gt;this&lt;/em&gt;  to be the object in which the method was defined.&lt;/p&gt;

&lt;p&gt;✔️ If the method is called without an object, then a function invocation occurs, where &lt;em&gt;this&lt;/em&gt; is either the global object window or undefined in strict mode.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;const greetUser &lt;span class="hljs-operator"&gt;=&lt;/span&gt; {&lt;br&gt;
    userName: &lt;span class="hljs-string"&gt;"Dan"&lt;/span&gt;,&lt;br&gt;
    dogName:&lt;span class="hljs-string"&gt;"milo"&lt;/span&gt;,&lt;br&gt;
    english: &lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt;(&lt;span&gt;&lt;/span&gt;) &lt;/span&gt;{&lt;br&gt;
        console.log(&lt;code&gt;${&amp;lt;span class="hljs-built_in"&amp;gt;this&amp;lt;/span&amp;gt;.userName} loves ${&amp;lt;span class="hljs-built_in"&amp;gt;this&amp;lt;/span&amp;gt;.dogName}&lt;/code&gt;);&lt;br&gt;
    },&lt;br&gt;
    hindi: &lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt;(&lt;span&gt;&lt;/span&gt;) &lt;/span&gt;{&lt;br&gt;
        console.log(&lt;span class="hljs-string"&gt;"Namaste "&lt;/span&gt; &lt;span class="hljs-operator"&gt;+&lt;/span&gt; &lt;span class="hljs-built_in"&gt;this&lt;/span&gt;.&lt;span class="hljs-built_in"&gt;name&lt;/span&gt;);&lt;br&gt;
    }&lt;br&gt;
};&lt;br&gt;
const greet &lt;span class="hljs-operator"&gt;=&lt;/span&gt; greetUser.english;&lt;br&gt;
greet();   &lt;span class="hljs-comment"&gt;// function invocation logs "undefined loves undefined"&lt;/span&gt;&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the separated method &lt;code&gt;english&lt;/code&gt; is invoked as a function, this is the global object or undefined in strict mode (not the &lt;code&gt;greetUser&lt;/code&gt; object), and since the global object does not contain such properties, it logs undefined.&lt;/p&gt;

&lt;p&gt;👍To solve the context issue, we can bind the function with the object using the&lt;code&gt;.bind()&lt;/code&gt; method.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;const greet &lt;span class="hljs-operator"&gt;=&lt;/span&gt; greetUser.english.bind(greetUser);&lt;br&gt;
greet();  &lt;span class="hljs-comment"&gt;// logs "Dan loves milo"&lt;/span&gt;&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="heading-conclusion"&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;By now, I think you have a pretty good understanding of how function invocation impacts the context, and what common pitfalls to avoid.&lt;/p&gt;

&lt;p&gt;🔜 In upcoming posts, I'll be writing about how constructor and indirect invocation impacts context as well as some common misunderstood cases.&lt;/p&gt;

&lt;p&gt;🙏 Thank you very much for reading this article. I hope you found it useful and if you did, please do share it with your friends or anyone who may find this interesting. ✨&lt;/p&gt;


&lt;p&gt;This article is published w/ &lt;a href="https://scattr.io?ref=dev"&gt;Scattr  ↗️&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Differences between arrow function and regular function in JavaScript</title>
      <dc:creator>mohit kushwaha</dc:creator>
      <pubDate>Sat, 18 Feb 2023 06:35:13 +0000</pubDate>
      <link>https://dev.to/mohitcodes/differences-between-arrow-function-and-regular-function-in-javascript-20d4</link>
      <guid>https://dev.to/mohitcodes/differences-between-arrow-function-and-regular-function-in-javascript-20d4</guid>
      <description>&lt;blockquote&gt;
&lt;h1 id="functions-are-the-bread-and-butter-of-javascript-programming"&gt;Functions are the bread and butter of JavaScript programming.&lt;/h1&gt;
&lt;/blockquote&gt;

&lt;p&gt;JavaScript functions can be defined in many ways. One can use the right syntax for specific needs by understanding the differences.&lt;/p&gt;

&lt;p&gt;One of the usual way of defining a function is by using function keyword.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-comment"&gt;// Function declaration&lt;/span&gt;&lt;br&gt;
&lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;double&lt;/span&gt;(&lt;span&gt;x&lt;/span&gt;)&lt;/span&gt;{&lt;br&gt;
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; x*&lt;span class="hljs-number"&gt;2&lt;/span&gt;;&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-comment"&gt;// Function expression&lt;/span&gt;&lt;br&gt;
&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; &lt;span class="hljs-keyword"&gt;double&lt;/span&gt; = &lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt;(&lt;span&gt;x&lt;/span&gt;)&lt;/span&gt;{&lt;br&gt;
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; x*&lt;span class="hljs-number"&gt;2&lt;/span&gt;;&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this blog, I will refer to these types as &lt;em&gt;regular functions&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A second way of defining a function, introduced in ES2015, is the &lt;em&gt;arrow function&lt;/em&gt; syntax.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; &lt;span class="hljs-keyword"&gt;double&lt;/span&gt; = (x) =&amp;gt; x*&lt;span class="hljs-number"&gt;2&lt;/span&gt;&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this blog, I will discuss some main differences between regular functions and arrow functions.&lt;/p&gt;

&lt;h2 id="1-this-value"&gt;1. this value&lt;/h2&gt;

&lt;h3 id="11-regular-function"&gt;1.1 regular function&lt;/h3&gt;

&lt;p&gt;Inside a regular function, this value (i.e. the context of execution) is dynamic, depends on how the function is invoked.&lt;/p&gt;

&lt;p&gt;During &lt;em&gt;simple invocation&lt;/em&gt;, the value of this is equal to the global object.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;demo&lt;/span&gt;(&lt;span&gt;&lt;/span&gt;)&lt;/span&gt;{&lt;br&gt;
   &lt;span class="hljs-built_in"&gt;console&lt;/span&gt;.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt;)&lt;br&gt;
}

&lt;p&gt;demo();             &lt;span&gt;// logs global window object&lt;/span&gt;&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;During &lt;em&gt;method invocation&lt;/em&gt;, the value of this is equal to the object owning it.&lt;/p&gt;
&lt;br&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; myDemo = {&lt;br&gt;
   greet(){&lt;br&gt;
        console.log(&lt;span class="hljs-keyword"&gt;this&lt;/span&gt;);&lt;br&gt;
   }&lt;br&gt;
}

&lt;p&gt;myDemo.greet();         &lt;span&gt;// logs myDemo Object&lt;/span&gt;&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;During &lt;em&gt;constructor invocation&lt;/em&gt;, the value of this refers to the newly created instance.&lt;/p&gt;
&lt;br&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;Demo&lt;/span&gt;(&lt;span&gt;&lt;/span&gt;) &lt;/span&gt;{&lt;br&gt;
  &lt;span class="hljs-built_in"&gt;console&lt;/span&gt;.log(&lt;span class="hljs-built_in"&gt;this&lt;/span&gt;);&lt;br&gt;
}

&lt;p&gt;&lt;span&gt;new&lt;/span&gt; Demo();      &lt;span&gt;// logs an instance of Demo&lt;/span&gt;&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="12-arrow-function"&gt;1.2 Arrow function&lt;/h3&gt;

&lt;p&gt;The value of this in case of arrow function is considerably different from that of regular function. Arrow function doesn't define it's own context of execution.&lt;/p&gt;

&lt;p&gt;The value of this inside an arrow function is the same as that of it's outer function. In other words, arrow function resolve the value of this &lt;em&gt;lexically&lt;/em&gt; and this behavior is independent of how and where the function is executed. &lt;/p&gt;


&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; myDemo = {&lt;br&gt;
   greet(){&lt;br&gt;
         console.log(&lt;span class="hljs-keyword"&gt;this&lt;/span&gt;);                &lt;span class="hljs-comment"&gt;// logs myDemo Object&lt;/span&gt;&lt;br&gt;
         &lt;span class="hljs-keyword"&gt;const&lt;/span&gt; &lt;span class="hljs-keyword"&gt;inner&lt;/span&gt; = () =&amp;gt; {&lt;br&gt;
                   console.log(&lt;span class="hljs-keyword"&gt;this&lt;/span&gt;);              &lt;span class="hljs-comment"&gt;// logs myDemo Object&lt;/span&gt;&lt;br&gt;
            }&lt;br&gt;
         &lt;span class="hljs-keyword"&gt;inner&lt;/span&gt;();&lt;br&gt;
      }&lt;br&gt;
}

&lt;p&gt;myDemo.greet();&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This great feature of arrow function make sure that when you use arrow function as callbacks, it doesn't define it's own execution context.&lt;/p&gt;

&lt;h2 id="2-constructors"&gt;2. Constructors&lt;/h2&gt;

&lt;h3 id="21-regular-function"&gt;2.1 regular function&lt;/h3&gt;


&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;Meal&lt;/span&gt;(&lt;span&gt;name&lt;/span&gt;)&lt;/span&gt;{&lt;br&gt;
    &lt;span class="hljs-built_in"&gt;this&lt;/span&gt;.name = name;&lt;br&gt;
}

&lt;p&gt;&lt;span&gt;const&lt;/span&gt; oatMeal= &lt;span&gt;new&lt;/span&gt; Meal(&lt;span&gt;"oats"&lt;/span&gt;);&lt;br&gt;
&lt;span&gt;console&lt;/span&gt;.log(oatMeal instanceOf Meal)      &lt;span&gt;// logs   true&lt;/span&gt;&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Meal is a regular function, when invoked with new keyword create an instance of type Meal.&lt;/p&gt;

&lt;h3 id="22-arrow-function"&gt;2.2 Arrow function&lt;/h3&gt;

&lt;p&gt;Arrow function cannot be used as a constructor. If you try to invoke an arrow function prefixed with new keyword, JavaScript throws an error:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-keyword"&gt;const&lt;/span&gt;  Meal = &lt;span class="hljs-function"&gt;(&lt;span&gt;name&lt;/span&gt;) =&amp;gt;&lt;/span&gt; {&lt;br&gt;
    &lt;span class="hljs-built_in"&gt;this&lt;/span&gt;.name = name;&lt;br&gt;
}

&lt;p&gt;&lt;span&gt;const&lt;/span&gt; oatMeal= &lt;span&gt;new&lt;/span&gt; Meal(&lt;span&gt;"oats"&lt;/span&gt;);   &lt;span&gt;// error : Meal is not a constructor&lt;/span&gt;&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Invoking new Meal('oats'), where Meal is an arrow function, throws TypeError: Meal is not a constructor.&lt;/p&gt;

&lt;h2 id="3-implicit-return"&gt;3. Implicit return&lt;/h2&gt;

&lt;h3 id="31-regular-function"&gt;3.1 regular function&lt;/h3&gt;

&lt;p&gt;return expression statement returns the result from a function:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-function"&gt;&lt;span&gt;function&lt;/span&gt; &lt;span&gt;demo&lt;/span&gt;(&lt;span&gt;&lt;/span&gt;) &lt;/span&gt;{&lt;br&gt;
  &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-number"&gt;100&lt;/span&gt;;&lt;br&gt;
}

&lt;p&gt;demo();  &lt;span&gt;//  return 100&lt;/span&gt;&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the return is missing or there is no statement after return, then regular function implicitly return undefined.&lt;/p&gt;

&lt;h3 id="32-arrow-function"&gt;3.2 Arrow function&lt;/h3&gt;

&lt;p&gt;Arrow functions return values the same way as regular functions, but with one useful exception.&lt;/p&gt;

&lt;p&gt;You can implicitly return an expression from the arrow function if its curly braces are omitted. These are the inline arrows function.&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-keyword"&gt;const&lt;/span&gt; increment = (&lt;span class="hljs-built_in"&gt;num&lt;/span&gt;) =&amp;gt; &lt;span class="hljs-built_in"&gt;num&lt;/span&gt; + &lt;span class="hljs-number"&gt;1&lt;/span&gt;;&lt;br&gt;
increment(&lt;span class="hljs-number"&gt;401&lt;/span&gt;);        &lt;span class="hljs-comment"&gt;//  402&lt;/span&gt;&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;num + 1 is the only expression in increment() arrow. The arrow function implicitly returns this expression without the use of the return keyword.&lt;/p&gt;

&lt;p&gt;Regular and arrow functions differ in important ways that allow you to choose the right syntax based on your needs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What other differences do you know between arrow functions and regular functions ?&lt;/em&gt;&lt;/p&gt;


&lt;p&gt;This article is published w/ &lt;a href="https://scattr.io?ref=dev"&gt;Scattr  ↗️&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
