javascript - Maintain this in a method passed by reference -
in following example, send parameter method "lostthis" object "instobj", "this" window object.
var obj = function() {}; obj.prototype.lostthis = function() { console.log('lostthis', instanceof obj, this); }; var instobj = new obj; var caller = { runfn: function(fn) { fn(); } }; caller.runfn(instobj.lostthis); console response:
lostthis false window in following example (slightly more complex) there different ways call methods of "instobj" same , others can keep "this" object.
var obj = function() {}; obj.prototype.methodrefhasthis = function() { var t = this; return function() { console.log('methodrefhasthis ', t instanceof obj, t); }; }; obj.prototype.methodreflostthis = function() { console.log('methodreflostthis ', instanceof obj, this); }; obj.prototype.methodrefmaybethis = function() { console.log('methodrefmaybethis ', instanceof obj, this); }; var instobj = new obj; var caller = { runfn: function(fn) { fn(); } }; // width jquery $('button') .bind('click', instobj.methodrefhasthis()) .bind('click', instobj.methodreflostthis); caller.runfn(instobj.methodrefhasthis()); caller.runfn(instobj.methodreflostthis); caller.runfn(function() { instobj.methodrefmaybethis(); }); console response:
methodrefhasthis true obj methodreflostthis false window methodrefmaybethis true obj methodrefhasthis true obj methodreflostthis false <button>press here</button> i understand happens jquery assign method event, could call method "methodreflostthis" no lose "this" object passed reference?
thanks
solution @am_not_i_am , @dan_davies_brackett , @ben_lee
var obj = function() {}; obj.prototype.lostthis = function() { console.log('lostthis', instanceof obj, this); }; var instobj = new obj; var caller = { runfn: function(fn) { fn(); } }; caller.runfn(instobj.lostthis.bind(instobj)); caller.runfn($.proxy(instobj.lostthis, instobj)); console response:
lostthis true obj lostthis true obj
if don't want use 1 of techniques you've found work, can use function.prototype.bind bind calling context new function...
caller.runfn(instobj.lostthis.bind(instobj)); this returns new function when invoked, set calling context whatever passed first argument .bind().
any additional arguments passed .bind() set fixed arguments returned function.
Comments
Post a Comment