Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jquery是否有dojo.hitch()的等价物?_Jquery - Fatal编程技术网

jquery是否有dojo.hitch()的等价物?

jquery是否有dojo.hitch()的等价物?,jquery,Jquery,请原谅我的无知,因为我对jquery不太熟悉。是否有一个等价物?它返回一个保证在给定范围内执行的函数 --编辑-- 根据要求,这里有一个例子。我经常使用hitch来确保回调在正确的对象中执行。例如,假设我有一个名为doSomethingAsync的实用程序方法,我给它传递了一个回调函数。使用hitch,我可以确保函数在特定范围内执行,即使实用程序方法执行ajax调用等等: expectedScopeObj = { flag: true, callback: function(){c

请原谅我的无知,因为我对jquery不太熟悉。是否有一个等价物?它返回一个保证在给定范围内执行的函数

--编辑-- 根据要求,这里有一个例子。我经常使用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));
   }
}

毫无疑问,回调函数可能会在不同的作用域中执行,并在
this.flag
未定义时抛出错误。但是,对于hitch,它保证在
execptedScopeObj

否中执行。至少在1.3.2中没有,因为我不知道1.4。然而,有一些:


bobince提到的
函数.bind
是一个非常有用的工具。您可以使用它简单地重写挂接功能:

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

至少从您链接的文档页面来看,这是我看到该功能工作的方式…

[ADMIN EDIT:注意下面更流行的答案-

我会选择
function.bind
,这将是未来JavaScript版本中执行此操作的标准方法。除了修复
,它还允许您将参数传递给目标函数


在所有浏览器都支持它之前,您可以这样做。

我知道这已经得到了回答,但并不正确。我相信这就是您要寻找的

更新


很多很多年以后,在大量的JavaScript工作之后,在我不再使用jQuery,因为浏览器兼容性已经不再是一个问题之后,我建议使用over,as。虽然这仍然是原始问题的正确答案,但我觉得有义务指导人们使用普通的解决方案,而不是依赖jQuery

在我看来,
hitch
在Dojo中更复杂

e、 g

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

您到底想实现什么?如果示例不是dojo.hitch(this,this,callback),那么示例代码将非常有用?这个jQuery插件是从Dojo改编而来的。虽然bind与Dojo相似,而且肯定非常有用,但它并不能完全完成任务。它通过适当设置
这个
来完成回调函数的任务。你还希望
挂接
做什么?你上面的示例代码根本不起作用。你是对的。我理解错了tood还以为你指的是jquery的bind函数。谢谢你,如果可能的话,我们尽量避免使用插件,因为我们更喜欢使用基础库支持。现在看来,我们最好的选择是使用dojo基础和jquery组合构建,这样我们就可以两全其美:)这是亡灵巫师的领地,但对任何人来说都是如此其他还没有解决这个问题的人,你可以看看@phiggins的挂接插件:更像僵尸,我刚刚在上面重新发布了这个链接
//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.
function f(a,b,c){return a+b*c}
var newF = hitch(null,f,1,undefined,3);
newF(2) /*1+2*3*/
/**
 * 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);