1
var obj = {
  name: 'hello',
  getName: function(){
  return () => {return this.name; }
  }
}
var name = 'world';
var nameFunc = obj.getName();
console.log(nameFunc())

And the result is "hello",not "world". I am a little confused.

huangxbd1990
  • 229
  • 2
  • 4
  • 10

1 Answers1

5

Arrow functions are "born" bound to the value of this as it was at the time of their creation. When you make your call to getName():

var nameFunc = obj.getName();

then inside getName() the value of this is a reference to obj. Your return statement constructs the arrow function, and that function is therefore bound to obj. It's as if you'd written:

  getName: function() {
    return function() {
      return this.name;
    }.bind(this);
  }

That's just the way arrow functions work, and yes it's different from regular functions.

Pointy
  • 405,095
  • 59
  • 585
  • 614