A more correct thread title would be "Canvas removeEventListener doesn't work for bind". Your problem is that removeEventListener() requires the same function reference as passed to addEventListener() to succeed in removing the listener. But bind() returns a different function reference every time it's used. That's why your code doesn't work. Of course, the reason bind() is needed at all is because by default event handlers execute in the browser window (global) context instead of the context of the object that triggered it. There are two ways to work around this: First way, store a global reference to your "this" so the function can access it. loadThis = this; // global this.addEventListener("tick", load); var i = 100; function load() { loadThis.removeEventListener("tick", load); console.log(this); console.log(i); } Second way, store a reference to the bound event handler function so it can be removed. var loadHandler = load.bind(this); // bound event handler this.addEventListener("tick", loadHandler); var i = 100; function load() { this.removeEventListener("tick", loadHandler); console.log(this); console.log(i); } At this point you should be wondering how both versions are able to access the value of i even though they execute in different contexts. That's because, while the first example executes in window context, the function still has access to local scope. Context is the current value of "this", while scope is how JavaScript resolves variables. JavaScript uses lexical (aka "static") scoping, so a function always has access to its parent, etc. variables no matter what context it's executing in. This article does a far more thorough job explaining all this: Understanding Scope and Context in JavaScript | Ryan Morr
... View more