2009-03-25 6 views
1

J'ai des problèmes avec ça. Pour une raison quelconque, updateCurrentItem est toujours appelé avec le même paramètre indépendamment.Passant de manière inattendue un nombre entier par référence?

function updatePromoList(query) { 
    query = query.toUpperCase(); 
    clearCurrentList(); 
    var numItems = 0; 
    currentItem = 0; 

    result_set = cached[query.charAt(0)][query.charAt(1)][query.charAt(2)]; 

    for(i in result_set){ 
     if(numItems >= NUMBER_MATCHES){ 
      $("<li/>").html("<span style='color: #aaa'>Please try to limit your search results</span>").appendTo("#possibilities").mouseover(function(event){ updateCurrentItem(numItems+1); }); 
      break; 
     } 

     promo = result_set[i]; 
     found_number = false; 
     if (!promo.client) 
      found_number = (promo.prj_number.toString().substr(0,query.length) == query) ? true : false; 

     if (query.length >= MATCH_NAME) { 
      if(promo.prj_name && typeof promo.prj_name == 'string'){ 
       found_name = promo.prj_name.toUpperCase().indexOf(query); 
      } else { 
       found_name = -1; 
      } 
      if (promo.client) 
       found_client = promo.client_name.toString().indexOf(query); 
      else 
       found_client = -1; 
     } else { 
      found_name = -1; 
      found_client = -1; 
     } 

     if(found_client >= 0) { 
      var thisIndex = numItems+1; 
      console.log("setting", thisIndex); 
      $("<li/>").text(promo.client_name).bind('click',function(e){ updatePromoChoice(e,promo); }).appendTo("#possibilities").mouseover(function(event){ updateCurrentItem(thisIndex); });  } else if(found_name >= 0 || found_number) {   var thisIndex = numItems+1; 
      console.log("setting", thisIndex); 
      $("<li/>").text(promo.prj_number+": "+promo.prj_name).bind('click',function(e){ updatePromoChoice(e,promo); }).appendTo("#possibilities").mouseover(function(event){ updateCurrentItem(thisIndex); }); 
     } 

     if(found_number || found_client >= 0 || found_name >= 0){ 
      numItems++; 
     } 
    } 
} 


function updateCurrentItem(i){ 
    currentItem = i; 
    console.log("updating to", i); 
} 

Les résultats de l'exécution de ce sont:

setting 0 
setting 1 
setting 2 
setting 3 
setting 4 
setting 5 
setting 6 
setting 7 
setting 8 
setting 9 
setting 10 
setting 11 
setting 12 
setting 13 

quand je déplace ma souris sur la zone de contenu contenant ces <li> s avec les événements mouseOver, tout ce que je vois toujours est:

updating to 4 

Toujours 4. Des idées?

Répondre

2

Vous créez une fermeture, mais il est toujours lié à la variable numItems:

function(event){ updateCurrentItem(numItems+1); } 

Ce que vous devez faire est quelque chose comme ceci:

(function(numItems){return function(event){ updateCurrentItem(numItems+1); }})(numItems) 

Edit: Je pense que je pourrais avoir la mauvaise fonction, mais le même principe:

function(event){ updateCurrentItem(thisIndex); } 

devrait être

(function(thisIndex) 
{ 
    return function(event){ updateCurrentItem(thisIndex); } 
})(thisIndex) 
+0

Votre code semble fonctionner mais je suis toujours confus. Je pensais que si j'utilisais une fermeture, elle obtiendrait la valeur de la variable quand la fermeture est créée, pas une référence à cette variable? – ashgromnies

+0

Non, JavaScript est un langage de liaison tardive. Discussion: http://stackoverflow.com/questions/422784/-/423073#423073. – bobince

Questions connexes