Более простой способ - использовать Function.bind
, тогда вам не нужно дублировать код для создания замыкания. Я буду использовать простой пример (в котором нет вашего пользовательского кода), чтобы объяснить
/**
* Retrieves the content of a url asyunchronously
* The callback will be called with one parameter: the html retrieved
*/
function getUrl(url, callback) {
$.ajax({url: url, success: function(data) {
callback(data);
}})
}
// Now lets' call getUrl twice, specifying the same
// callback but a different id will be passed to each
function updateHtml(id, html) {
$('#' + id).html(html);
}
// By calling bind on the callback, updateHTML will be called with
// the parameters you passed to it, plus the parameters that are used
// when the callback is actually called (inside )
// The first parameter is the context (this) to use, since we don't care,
// I'm passing in window since it's the default context
getUrl('/get/something.html', updateHTML.bind(window, 'node1'));
// results in updateHTML('node1', 'response HTML here') being called
getUrl('/get/something-else.html', updateHTML.bind(window, 'node2'));
// results in updateHTML('node2', 'response HTML here') being called
Function.bind
является новым, так что если вам нужна обратная поддержка, посмотрите раздел Совместимость Function.bind
Наконец, я знаю, что вопрос не был помечен как jQuery. Это был самый быстрый способ показать асинхронную функцию, не сталкиваясь с кросс-браузерными проблемами