Подтвердить что ты не робот

Имеет ли 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.

4b9b3361

Ответ 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);