2010-10-28 7 views
2

c'est la chose la plus étrange. Mon code est ci-dessous:Javascript variable de fonction devient soudainement indéfini?

function menuSwipe(init){ 
    dojo.query('div.fill div.container div.menu div.group ul').forEach(function(item){ 
     dojo.fx.wipeOut({ 
      node: item, 
      duration: 1 
     }).play(); 
     dojo.query('li', item).forEach(function(childrenItem){ 
      if (dojo.hasClass(childrenItem, 'active')) 
       childrenItem.parentNode.className = 'items active'; 
     }); 
     if (item.className == 'items active') { 

      dojo.query('div.category', item.parentNode).forEach(function(parentItem){ 
       setTimeout(function(){ 
        menuOpen(parentItem, init); 
        doGrayscale(parentItem); 
       }, 100); 
      }); 
     } 
    }); 
} 

Fondamentalement init reste en mémoire jusqu'à ce qu'il passe dans le cas (item.className == 'items active') conditionnelle. Après cela, il devient undefined. C'est une valeur booléenne que je mets en place. Tant qu'il est avant if (item.className == 'items active') il conservera sa valeur. Je n'ai aucune raison de le faire. J'ai essayé de faire this.init = et en le définissant comme var init = init. Est-ce que quelqu'un sait ou existe-t-il un moyen de conserver sa valeur tout au long de la fonction? Ce n'est pas le nom d'init, j'ai essayé un nom différent et ça fait toujours la même chose.

Merci, Darren

+0

Vous n'utilisez pas la variable 'init' partout, donc je ne sais pas comment vous avez découvert à être indéfini ou la façon dont il serait question. Y a-t-il quelque chose qui manque ici? – Chuck

+0

Salut, je l'ai fixé où il devrait être, j'ai oublié de revenir en arrière quelques modifications. – Darren

+0

Quelle est la valeur de 'init' quand vous appelez' menuSwipe' et à quoi ressemble 'menuOpen' avec' init'? – lincolnk

Répondre

2

Le problème est que le délai d'attente est en cours d'exécution après que la fonction est terminée, si la variable parentItem est passé hors de portée lorsque les courses de délai d'attente.

Créez une variable locale dans cette étendue, de sorte qu'une fermeture soit créée pour la fonction de temporisation. De cette façon, chaque itération a sa propre variable:

dojo.query('div.category', item.parentNode).forEach(function(parentItem){ 
    var itemCopy = parentItem; 
    window.setTimeout(function(){ 
    menuOpen(itemCopy, init); 
    doGrayscale(itemCopy); 
    }, 100); 
}); 
+3

Eh? Je ne suis pas sûr de ce que cela a à voir avec la question de Darren (init mystérieusement devenir indéfini). Je ne sais pas non plus quel problème votre réponse devrait résoudre de toute façon, la fermeture autour du rappel de setTimeout est créée à partir du rappel de forEach ... – Angiosperm

+0

Je ne comprends pas ... 'parentItem' est déjà disponible dans la fermeture, ne sont pas vous venez de faire un autre pointeur vers un argument déjà local? –

Questions connexes