jQuery有类似于dojo.hitch()的功能吗?

17

请谅解我的无知,因为我对jquery不是很熟悉。是否有类似于dojo.hitch()的等价物?它返回一个确保在给定范围内执行的函数。

-- 编辑 -- 如所请求,这里提供一个示例。我经常使用hitch来确保回调在正确的对象中执行。例如,假设我有一个名为doSomethingAsync的实用方法,并将其传递给一个回调函数。使用hitch,即使实用方法执行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));
   }
}

如果没有使用 hitch,回调函数可能会在不同的作用域中执行,并且当使用 this.flag 时会抛出错误并且未定义。但是,使用 hitch 将保证它在 execptedScopeObj 中执行。


你想要实现什么目标?提供一份示例代码会更有帮助。 - Ariel
2
这个例子不应该是dojo.hitch(this, this,callback)吗? - Murali
这个 Hitch jQuery 插件是从 Dojo 改编而来的。 - PHearst
7个回答

43

我知道这个问题已经有答案了,但是不正确。jQuery.proxy 是你要找的。

更新

很多年后,经过大量 JavaScript 工作,并且由于浏览器兼容性问题变得不那么重要,我建议使用Function.prototype.bind代替jQuery.proxy,如@bobince建议。虽然这仍然是对原始问题的正确答案,但我感到有责任向人们指出一个基础解决方案,而不是依赖 jQuery。


6

[管理员编辑: 注意下面更受欢迎的答案。—danorton]

我会选择使用 function.bind,因为它将成为 JavaScript 未来版本中执行此操作的标准方式。除了修复 this,它还允许您将参数传递到目标函数中。

在所有浏览器都原生支持之前,您可以自己进行 hack 支持


虽然 bind 很相似,而且肯定非常有用,但它并不能完全完成任务。 - Lightbeard
嗯...它完成了使用适当的this回调函数的任务。你还期望hitch做什么?你上面的示例代码根本不起作用。 - bobince
你说得对。我误解了,以为你在提到 jQuery 的 bind 函数。谢谢。 - Lightbeard

2

至少在1.3.2版本中没有,我不确定1.4版本。但是有一些插件

(function($) {
  $.fn.hitch = function(ev, fn, scope) {
    return this.bind(ev, function() {
      return fn.apply(scope || this, Array.prototype.slice.call(arguments));
    });
  };
})(jQuery);  

我们尽可能避免使用插件,因为我们更喜欢使用基础库的支持。目前看来,我们最好的选择是使用结合了Dojo和jQuery的构建,这样我们可以兼顾两者的优点 :) - Lightbeard
这是死灵法师的领地,但对于还没有解决这个问题的其他人,您可能需要查看@phiggins的hitch插件:https://github.com/phiggins42/bloody-jquery-plugins/blob/master/hitch.js - Oskar Austegard
更加像僵尸一样,我刚刚重新发布了上面的链接。 - PHearst

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.

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);
};

至少根据您提供的文档页面,这是我看到该函数的工作方式...


0
在我看来,Dojo中的hitch更加复杂。

e.g.,

function f(a,b,c){return a+b*c}
var newF = hitch(null,f,1,undefined,3);
newF(2) /*1+2*3*/

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接