Потому что на момент вызова кода, переменная id определена, но не инициализирована, т.е. undefined.
Перед выполнением функции, интерпретатор ищет все упоминания var в теле функции, и определяет переменные в ее начале.
Код из вашего примера с точки зрения интерпретатора эквивалентен следующему коду:
function(a) {
var id; // id === undefined
alert(id); // undefined
id = 1; // id === 1
}
Вам нужно просто убрать var перед id в коллбэке, но тогда следует помнить, что все другие функции, заданные внутри func(id) и вызванные после того, как придет ответ от сервера, получат значение 1 в переменной id, т.е.
function func(id) {
var func2 = function () {
alert (id) // 1
};
$.ajax({
type: "post",
url: host+'/structure/branch',
data: {id: id, type: 'all'},
success: function(a) {
alert(id); // undefined
id = 1;
func2();
}
});
}
func(0);