2013-03-03 5 views
1

Essais de capturer le temps entre le key-key et le keydown ainsi qu'entre le key-key et le keydown de la frappe suivante objet en utilisant des clés et des valeurs et en poussant cet objet à un tableau global. La raison de globals est que je ne sais pas comment passer des paramètres entre les fonctions liées aux événements keydown, keypress et keyup. Chaque fonction pilotée par événement contient des données que je veux enregistrer dans un objet en tant que paires de valeurs clés telles que le code de touche et le caractère tapé. Chaque objet représente une séquence de touches mais contient également ou utilise pour le calcul des informations de la séquence de touches précédente. À la fin, les données de chaque élément du tableau global semblent être soit indéfinies, soit les dernières données entrées.Enregistrement d'un objet global dans un tableau global, modification des valeurs dans l'objet et nouvelle sauvegarde

Ma question est pourquoi? J'ai résolu le problème en éliminant l'objet global (valeurs de clé) et en le remplaçant par des variables globales qui changent à chaque frappe. Ensuite, j'ai pu créer un objet dans une fonction (fonction scope) et pousser cet objet dans le tableau global avec chaque nouveau caractère. Cela semble fonctionner. Instinctivement, il semble que ce devrait être l'inverse. Je veux juste comprendre pourquoi cela fonctionne de cette façon. Je suis au tiers du livre de Zakas et j'ai encore beaucoup à apprendre.

Répondre

1

Vous envisagez des variables sous la forme d'une boîte contenant des objets. Lorsque vous le faites, dites a = b, alors tout ce qui était en b est copié en a. Ce n'est pas comme ça que fonctionne JavaScript. Au lieu de cela, JavaScript fonctionne en ayant un objet quelque part, et les variables pointent vers cet objet. Ensuite, lorsque vous faites a = b, a pointe maintenant vers le même objet que b; lorsqu'une propriété de b est modifiée, la même propriété de a est modifiée, car l'objet vers lequel ils pointent est le même.

Si vous voulez a = b pour faire une copie, vous devez le faire explicitement. Par exemple, si vous avez des propriétés foo et bar, vous pouvez le faire comme ceci:

a = { 
    foo: b.foo, 
    bar: b.bar 
}; 

Cette copie seulement un niveau plus bas, bien que, si b.foo est un objet trop, alors a.foo référerons au même objet comme b.foo, et encore, modifier les propriétés de a.foo fera les mêmes changements apparaissent sur b.foo, et ainsi de suite.

+0

Merci icktoofay: – JimFuqua

+0

Merci icktoofay: Cela peut expliquer le problème que j'avais. Je suppose que vous dites que lorsque je poussais un objet global dans un tableau global, le tableau global contenait des clés et des pointeurs au lieu de clés et de données. Quand j'ai changé pour pousser un objet déclaré dans une fonction dans le tableau global, il a poussé l'objet sous la forme de clés et de données au lieu de pointeurs qui seraient hors de portée à la sortie de la fonction. Est-ce une évaluation correcte? Je reçois encore quelques mauvaises données quand j'annule la frappe mais c'est à prévoir et je peux juste supprimer cet objet. – JimFuqua

+0

@ user1117975: Je pense que votre problème avant était de pousser le même objet à chaque fois, et comme vous continuiez à modifier cet objet, chaque élément du tableau semblait changer. – icktoofay

Questions connexes