Coding Recipes
  • Introduction
  • Welcome
    • Introduction
  • SEO Recipes
    • How can I add more metadata to my page to improve SEO?
  • Console Recipes
    • How to colour text in the browser and server console
  • Array Recipes
    • How can I filter out falsey values?
  • Object Recipes
    • How can I clone an object?
    • How can I destructure an object?
    • How can I pretty-print an object?
    • How can I conditionally add a key-value into an object?
    • How can I pull keys, values and entries off an object?
    • How can I build an object with computed property names?
    • What does 'this' mean?
    • How does inheritance work between objects?
    • How can I build a query string from an object?
    • How to instantiate a class using an object of that class?
    • Nested Ternaries vs Switch Statements
  • String Recipes
    • How can I tokenise a string of values into an array?
    • How can I parse a template string into its constant and variable parts?
  • Function Recipes
    • How to find out where your function is being called from
    • How can I simplify argument validation in a function?
    • How would I handle errors?
    • What types of functions can I rebind 'this' on?
    • How can I find out the length of a function's parameter list?
  • Asynchronous Recipes
    • How do I use fetch?
    • How do I use Promises?
    • How do I use async and await?
    • How do I use jQuery to make async calls?
    • How can I use Axios to make async calls?
    • How can I use Web Workers to achieve parallelism?
  • React Recipes
    • How can I DRY-up passing props to a React component?
    • How can I conditionally render JSX?
    • What are the different types of PropTypes I can use?
    • How can I handle a component throwing an uncaught exception?
    • How can I use context to selectively pass data down a component hierarchy? (2 approaches)
    • How to define a Higher Order Component (HOC) in React
    • What are the different lifecycle methods in React?
    • HOCs vs. RenderProps - How To Share State
    • How to use refs in React (3 Approaches)
  • React Router Recipes
    • How do I install react router 4 as an application dependency
    • What are the different types of routes that I can create?
    • How can I navigate between different types of routes?
    • How can I style the link for the route that is currently active?
    • How can I pass parameters to my routes?
    • How can I match routes by making sure parameters match a specific format?
    • How can I parse query parameters from a route?
    • How can I define a default catch-all route?
    • How can I render multiple components for a single route?
    • How can I create nested routes?
    • How can I redirect from one route to another route?
    • How can I intercept transitioning from one route to another route?
  • Conditional Logic Recipes
    • How can I avoid using multiple if..else if...else if style code?
    • How can I check which of several booleans is true?
  • RxJS Recipes
    • How can I subscribe to a series of numbers?
    • How can I subscribe to an array of numbers?
    • How can I transform an array of numbers?
    • How can I listen to double-click events?
    • How can I create an Observable from something else?
  • Redux Recipes
    • Redux - Architecture
    • React-Redux - Architecture
    • How to define custom middleware for Redux
    • How to enable Hot Module Reloading for a React-Redux-Webpack application
  • GraphQL
    • How can I create a simple GraphQL client and server?
    • Stuff
Powered by GitBook
On this page

Was this helpful?

  1. Object Recipes

What does 'this' mean?

//=======================================================
// Remember the acronym GONE (Global,Object,New,Explicit)
// It describes the different execution contexts within
// which "this" is evaluated in your code.
//=======================================================
//=======================================================
//Global Execution Context
//=======================================================
this.console;                                      // (1)
//=======================================================
// (1) Outside of a function, "this" means the global object.
//     In a browser the global object is the window object.
//     So the code above is the same as window.console;
//=======================================================
//=======================================================
// Object Execution Context
//=======================================================
var square = {
  width: 5,
  height: 5,
  getArea: function () {
    return this.width * this.height;                // (1)
  }
}

console.log("Area of square is " + square.getArea());
//=======================================================
// (1) When a function is called on an object, the value
//     of "this" inside that function, is the object that
//      the function is called on i.e. square.
//=======================================================
//=======================================================
// New Execution Context
//=======================================================
function Human(name) {
  this.name = name;                                 // (1)
  this.printName = function () {
    console.log("My name is " + this.name);         // (2)
  }
}

var andy = new Human("Andrew");
andy.printName()
//=======================================================
// (1) When the "new" keyword is used along with a function call,
//     the function behaves like a constructor. It's almost
//     as if the function is rewritten to look like this:
//
//    function Human(name) {
//      var this = {};
//      this.name = name;
//      this.printName = function () {
//         console.log("My name is " + this.name);
//      }
//      return this;
//    }
//
//    It's the "this" object which the function generates
//    that gets returned assigned to the variable andy.
//
// (2) The value of "this" corresponds to the "this" object
//     that gets implicitly generated and returned on behalf
//     of your function.
//=======================================================
//=======================================================
// Explicit Execution Context
//=======================================================
var resultA = {};
var resultB = {};
var resultC = {};

function sum(a, b) {
  this.answer = a + b;
}

function product(a, b) {
  this.answer = a * b;
}

sum.call(resultA, 2, 3);                            // (1)

product.apply(resultB, [2, 3]);                     // (2)

var product2 = product.bind(resultC);               // (3)
product2(4, 5);

console.log("2 + 3 is " + resultA.answer);
console.log("2 * 3 is " + resultB.answer);
console.log("4 * 5 is " + resultC.answer);
//=======================================================
// (1) We use the call() method on the sum() function to
//     explicitly use resultA as the value for "this"
//     inside of the sum() function
// (2) We use the apply() method on the product() function to
//     explicitly use resultB as the value for "this"
//     inside of the product() function
// (3) We use the bind() method on the product() function to
//     explicitly use resultC as the value for "this"
//     inside of the curried product() function
//
// [*] You may have noticed that call/apply result in a function call.
//     However, bind results in a new function, which you can call later on.
//=======================================================
PreviousHow can I build an object with computed property names?NextHow does inheritance work between objects?

Last updated 5 years ago

Was this helpful?