dojo.hitch可以将一个函数绑定到具体的上下文上执行。首先考虑1个或者2个参数的情形。再接受2个参数的时候,第一个参数表示要绑定的对象,第二个参数表示要绑定到对象上的方法(可以是一个函数定义或者字符串形式的函数名)。如:
第一种形式的调用:
/* *o: 要绑定的对象 *f: o中的成员函数 */ dojo.hitch(o, o.f);
调用后返回的结果为:
function() { return o.f.apply(o, arguments); }
因此,dojo.hitch会返回一个函数
第二种调用形式:
/* *o: 要绑定的对象 *f: o中的成员函数 */ dojo.hitch(o, "f");
调用后的返回结果:
function() { return o["f"].apply(o, arguments); }
dojo不仅能绑定成员函数,还能将一个普通函数绑定到一个对象上,或者将一个对象上的方法,绑定到另一个对象上。
/* *o: 要绑定的对象 *f: 普通函数 */ dojo.hitch(o, f); /*返回结果*/ function() { return f.apply(o, arguments); } /* *o: 要绑定的对象 *f: p中的成员函数 * o != p */ dojo.hitch(o, p.f); /*返回结果*/ function() { return p.f.apply(o, arguments); }
如果只传递一个参数,那么相当于dojo.hitch中第一个参数被置为null,那么所传递的函数将在全局空间执行:
/* *f: 传递的函数 */ dojo.hitch(null, f); /*返回结果*/ f dojo.hitch(null, "f"); /*返回结果*/ function() { return dojo.global[f].apply(dojo.global, arguments); //dojo.global代表全局对象 }
当传递给dojo.hitch的参数大于2个时,第一个参数仍然是要绑定的对象,第二个参数也是要绑定到对象上的方法,其他的参数是传递给这个被绑定方法的参数:
/* *o: 要绑定的对象 *f: 要绑定的方法 *a1, a2,... ,an:要传递给f的参数 */ dojo.hitch(o, f, a1, a2,..., an); /*返回一个函数*/ function() { return f.apply(o, [a1, a2, ..., an].concat(argumetns)); }
比如有这样一个函数:
var printArgs = function(str1, str2, str3) { alert(str1 + str2 + str3); }
通过dojo.hitch调用:
var print = dojo.hitch(null, printArgs, "this", "is"); print("easy"); // 打印this is easy /* 实际上调用printArgs("this", "is", "easy");
dojo.hitch实际上就是将一个函数绑定到另一个对象上面,并将这个函数的调用过程封装在一个匿名函数之中,然后将这个匿名函数作为返回值。