Arrow functions do not have their own this

The reason var self = this appears in every callback-heavy file is that a normal function gets its own this, decided by how it is called. An arrow function does not have one at all — it closes over the this of the surrounding scope, lexically.

// the old dance
var self = this;
this.items.forEach(function (item) { self.render(item); });

// arrow
this.items.forEach(item => this.render(item));

That also means an arrow function is the wrong choice for an object method, a prototype method, or anything called with .call() — the binding you are trying to set is the one it ignores. They have no arguments object either, which is usually an improvement. Use them for callbacks; use ordinary functions for anything that is meant to receive a receiver.