Se ejecuta por la forma en la que la colocaste. Al ser una llamada de retorno y querer pasarle un argumento, lo correcto sería hacerlo de esta manera:
    
Código Javascript
:
Ver original- $("#"+datos[i].idruta+".fila").on("click", function(){ 
-     detalles(datos[i]) 
- }); 
Sin embargo, al ser contenido dinámico, lo más adecuado es que delegues el evento de la siguiente manera:    
Código Javascript
:
Ver original- $("#contenedor").on("click", ".fila", function(){ 
-     //Aquí ejecutas tus instrucciones 
- }); 
Obviamente, esto debe de ir fuera del bucle. Incluso puede ir por fuera del método 
$.ajax(). Noto también que usas la función 
eval(), la cual no se recomienda su uso por medidas de seguridad, razón por la cual te desaconsejo su uso. 
Saludos