я почти разобрался
этот метод делает рекурсивный вызов
и похоже подмену документа освобождая память от своей работы
поэтому переменная в обработчике запроса остаётся не определённой
почему рекурсивный 
первый вывод alert(response[0] + ' ' + response[1])   
потом вывод в теле вызова xhr()
var xmlhttp
			try  { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } 
			catch (e) { try {  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) {  xmlhttp = false; } }
			if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp = new XMLHttpRequest();  }
var response = [], lastReadyState;
		response[1] = document
	 function xhr() 
        {   
			var  readyState = xmlhttp.readyState;
			
			if(readyState !== lastReadyState) 
			{
				switch(readyState) 
			    {  case xmlhttp.UNSENT:  xmlhttp.open('POST', '/', true); 
  						  xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); break;
				   case xmlhttp.OPENED:   xmlhttp.send("mod=" + encodeURIComponent('sendo') );  break;
							//case xmlhttp.HEADERS_RECEIVED: break; //no coments
							//case xmlhttp.LOADING:  break; //...
				   case xmlhttp.DONE: response[0] = xmlhttp.response; alert(xmlhttp.response);  return;
				}
				lastReadyState = readyState;
			
			}
        
			 setTimeout(xhr); 
			
} 
 xhr();  
alert(response[0] + ' ' + response[1])
при чем если делать собственный вызов без тайм аута переполняется стек  
Maximum call stack size exceeded
и такая  же ошибка выскакивает если в функцию предавать параметры
например  xhr( response[0])