I still don't really understand why you need this object and need to stick it on the imageEditor object.  Since the callback functions get registered, I thought that they would keep this closure and its variables alive as needed.

If you do need to this object, I'd recomment you call it something that does not have ctx in it because that is easy to confuse with webgl contexts.  Maybe this:

 var state = imageEditor.savedState = {}