原谅我的无知,因为我对jquery并不熟悉。是否等同于dojo.hitch()?它返回一个保证在给定范围内执行的函数。
- 编辑 -
根据要求,这是一个例子。我经常使用hitch来确保在正确的对象中执行回调。例如,假设我有一个名为doSomethingAsync
的实用程序方法,我将其传递给回调函数。有了故障,我可以确保函数在特定范围内执行,即使实用程序方法执行ajax调用等等:
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));
}
}
没有故障,回调函数可能在不同的范围内执行,并且在this.flag
未定义的情况下会抛出错误。但是,如果有障碍,可以保证在execptedScopeObj
内执行。
答案 0 :(得分:44)
我知道这已被回答,但不正确。我相信jQuery.proxy
是您正在寻找的。 p>
<强>更新强>
许多年后,经过大量的JavaScript工作,并且在删除了我对jQuery的使用之后,由于浏览器兼容性问题变得不那么严重,我建议使用Function.prototype.bind
而不是jQuery.proxy
,{ {3}}。虽然这仍然是原始问题的正确答案,但我觉得有责任将人们引向一个普通的解决方案而不是依赖于jQuery。
答案 1 :(得分:6)
[ ADMIN EDIT :请注意以下更受欢迎的答案.- danorton]
我会选择function.bind
,这将是在未来版本的JavaScript中执行此操作的标准方法。除了修复this
之外,它还允许您将参数传递给目标函数。
在所有浏览器本地支持之前,您可以hack support in yourself。
答案 2 :(得分:2)
没有。至少在1.3.2中,因为我不知道1.4。但是,有一些plugins:
(function($) {
$.fn.hitch = function(ev, fn, scope) {
return this.bind(ev, function() {
return fn.apply(scope || this, Array.prototype.slice.call(arguments));
});
};
})(jQuery);
答案 3 :(得分:1)
bobince提到的function.bind
是一个非常有用的工具。你可以用它来简单地重写hitch函数:
// 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);
};
至少基于您链接的文档页面,这就是我看到函数工作的方式......
答案 4 :(得分:1)
//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.
答案 5 :(得分:0)
在我看来,Dojo中的hitch
更复杂,
例如,
function f(a,b,c){return a+b*c}
var newF = hitch(null,f,1,undefined,3);
newF(2) /*1+2*3*/
答案 6 :(得分:0)
/**
* 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);