Имеет ли jquery эквивалент dojo.hitch()?
Простите мое невежество, поскольку я не так хорошо знаком с jquery. Есть ли эквивалент dojo.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
равна undefined. Однако с зацепкой гарантируется выполнение в execptedScopeObj
.
Ответы
Ответ 1
Я знаю, что на это был дан ответ, но не правильно. jQuery.proxy
- это то, что вы ищете, я верю.
UPDATE
Много, спустя много лет после много работы JavaScript, и после удаления моего использования jQuery, поскольку совместимость с браузером стала менее проблематичной, я бы рекомендовал использовать над jQuery.proxy
, поскольку @bobince предложил. Хотя это по-прежнему правильный ответ на исходный вопрос, я чувствую себя обязанным направлять людей к ванильному решению, а не полагаться на jQuery.
Ответ 2
[ ADMIN EDIT: обратите внимание на гораздо более популярный ответ, ниже. danorton]
Я бы пошел на function.bind
, что будет стандартным способом сделать это в будущих версиях JavaScript. Помимо фиксации this
, он позволяет передавать аргументы в целевые функции.
Пока все браузеры не поддерживают его, вы можете взломать поддержку самостоятельно.
Ответ 3
Нет. Не в 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);
Ответ 4
function.bind
, упомянутый bobince, - довольно полезный инструмент. Вы можете использовать его, чтобы переписать функцию сцепки довольно просто:
// 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);
};
По крайней мере, на основе связанной с документом страницы, я видел, как работает функция...
Ответ 5
//why not just:
(function($){
$.hitch = function(scope, fn){
return function(){
return fn.apply(scope, arguments);
}
}
})(JQuery);
//This works exactly like Dojo hitch from what I can tell.
Ответ 6
На мой взгляд, hitch
в Dojo является более сложным,
например,
function f(a,b,c){return a+b*c}
var newF = hitch(null,f,1,undefined,3);
newF(2) /*1+2*3*/
Ответ 7
/**
* 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);