does jquery have an equivalent of dojo.hitch()?
Forgive my ignorance as I am not as familiar with jquery. Is there an equivalent to dojo.hitch()? It returns a function that is guaranteed to be executed in the given scope.
-- edit --
As requested, here is an example. I use hitch very frequently to ensure callbacks are executed within the right object. For example, let's say I have a utility method called doSomethingAsync
and I p开发者_C百科ass it a callback function. With hitch, I can make sure the function is executed within a particular scope even if the utility method performs ajax calls and so forth:
expectedScopeObj = {
flag: true,
callback: function(){console.debug(this.flag);},
main: function() {
// without hitch the callback function would not find flag
core.util.doSomethingAsync(dojo.hitch(this, this.callback));
}
}
Without hitch, the callback function could possibly be executed in a different scope and an error would be thrown with this.flag
being undefined. However, with hitch it is guaranteed to be executed within execptedScopeObj
.
I know this has been answered, but not correctly. jQuery.proxy
is what you are looking for I believe.
UPDATE
Many, many years later after lots of JavaScript work, and after stripping out my usage of jQuery since browser compatibility has become less of an issue, I would recommend using Function.prototype.bind
over jQuery.proxy
, as @bobince suggested. While this is still the correct answer to the original question, I feel obligated to direct people to a vanilla solution rather than relying on jQuery.
[ADMIN EDIT: Note the much more popular answer, below.—danorton]
I'd go for function.bind
, which will be the standard way of doing this in future versions of JavaScript. As well as fixing this
, it allows you to pass arguments through to the target functions.
Until all browsers support it natively, you can hack support in yourself.
No. Not in 1.3.2, at least, as I don't know about 1.4. There are, however, some plugins:
(function($) {
$.fn.hitch = function(ev, fn, scope) {
return this.bind(ev, function() {
return fn.apply(scope || this, Array.prototype.slice.call(arguments));
});
};
})(jQuery);
The function.bind
mentioned by bobince is a pretty useful tool. You could use it to rewrite the hitch function pretty simply:
// The .bind method from Prototype.js
if (!Function.prototype.bind) { // check if native implementation available
Function.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments),
object = args.shift();
return function(){
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};
}
jQuery.hitch = function(scope, fn) {
if (typeof fn == "string") fn = scope[fn];
if (fn && fn.bind) return fn.bind(scope);
};
At least based on the doc page you linked, this is how I saw the function working...
//why not just:
(function($){
$.hitch = function(scope, fn){
return function(){
return fn.apply(scope, arguments);
}
}
})(JQuery);
//This works exactly like Dojo's hitch from what I can tell.
/**
* This is for simulate dojo.hitch.
* @param $
*/
(function($) {
$.hitch = function(context, func) {
var args = Array.prototype.slice.call(arguments,
2/*Remove context, and func*/);
return function() {
return func.apply(context,
Array.prototype.concat.call(args, arguments));
};
};
})(jQuery);
In my mind, hitch
in Dojo is more complex,
e.g.,
function f(a,b,c){return a+b*c}
var newF = hitch(null,f,1,undefined,3);
newF(2) /*1+2*3*/
精彩评论