Во-первых, читайте про замыкания и bind.
Во-вторых, вам eval тут не нужен триста лет.
В-третьих, data-callback="after_upload($(this))", который у вас потом отправится в eval - это вообще феерический говнокод.
Даже если у вас на странице куча форм с разными коллбеками, правильнее и безопаснее было бы сделать, например, фабрику, которая возвращает нужный коллбек в зависимости от параметра.
Например так:
<form name="upload" data-ajax="true" data-callback="after_upload_1">
<!-- ............ элементы формы -->
</form>
<script>
function callbackForge(type) {
var callback;
switch (type) {
case "after_upload_1": callback = function(a,b,c) {...}; break;
case "after_upload_2": callback = function(a,b,c) {...}; break;
...
case "after_upload_n": callback = function(a,b,c) {...}; break;
}
return callback;
}
$('form[data-ajax]').on('submit', function(event){
event.preventDefault();
var th = $(this);
var form_name = th.attr('name');
var data = th.serialize();
var callback = callbackForge(th.data('callback'));
$.post('/ajax/'+form_name,{data: data})
.success(function(d){
// парсится ответ и в зависимости от ответа
// показывает либо ошибки, либо информацию о сохрнении
ParseResponse(d, 'form[name='+form_name+']');
callback(th, data, event); // и тут уже какие параметры хотите, такие и передавайте
});
});
</script>