Why is this returning NAN NAN NAN

stargateatlantis
stargateatlantis used Ask the Experts™
on
If you look at the following function how come this is returning NAN NAN NAN and how to fix it.

var Maths = {
  numbers: [1, 2, 3],
  multiplier: 2,
  multiplied: function () {
    return this.numbers.map(function(n) {
      return n * this.multiplier;
    });
  }
};

Maths.multiplied(); // [NaN, NaN, NaN]

Open in new window

Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Expert of the Year 2008
Top Expert 2008
Commented:
var Maths = {
  numbers: [1, 2, 3],
  multiplier: 2,
  multiplied: function () {
      // within this function 'this' refers to the object
      // assigned to Maths. That's why you can get the length
      // of 'numbers': 
      //    alert(this.numbers.length);
      //    alert(this.toString()); // [object Object]
      
      // "capture" a reference to the object assigned to Maths
      var self = this;
      
      return this.numbers.map(function(n) {
          // However, within this scope, 'this' is the window object
          //     alert(this.toString()); // [window Object]
          // not the object assigned to Maths.  Since you need
          // a reference to the object assigned to Maths, you need 
          // to use the "captured" reference
         return n * self.multiplier;
      });
  }
};

Maths.multiplied();

Open in new window


In case it's not obvious, since you are assigning a function to "multiplied", that function is owned/bound to the object being assigned to Maths.  Thus, within that function the context of 'this' refers to the Maths object.  By contrast, in the callback to map, that anonymous function is not bound/assigned to any (custom) object.  So the default context of 'this' is the window object.

In case you are interested:
http://ryanmorr.com/understanding-scope-and-context-in-javascript/

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial