1

キーと値を使用して時間とキー データをグローバル オブジェクトに書き込み、このオブジェクトをグローバル配列にプッシュすることにより、キーアップとキーダウンの間、および次のキーストロークのキーアップとキーダウンの間の時間をキャプチャしようとしています。グローバルの理由は、keydown、keypress、keyup イベントにバインドされた関数間でパラメーターを渡す方法がわからないためです。各イベント ドリブン関数には、キー コードや入力された文字などのキーと値のペアとして 1 つのオブジェクトに保存したいデータがあります。各オブジェクトは 1 つのキーストロークを表しますが、前のキーストロークからの情報を含むか、計算に使用します。

最後に、グローバル配列の各要素のデータは、未定義または最後に入力されたデータのようです。

私の質問はなぜですか?

グローバルオブジェクト(キー値)を削除し、キーストロークごとに変化するグローバル変数に置き換えることで、問題を回避しました。次に、関数 (関数スコープ) 内にオブジェクトを作成し、そのオブジェクトを新しい文字ごとにグローバル配列にプッシュすることができました。うまくいくようです。本能的に、逆であるべきだと感じます。なぜこのように機能するのかを理解したいだけです。私は Zakas の本を 3 分の 1 読み終えましたが、まだまだ学ぶべきことがたくさんあります。

4

1 に答える 1

1

変数は、オブジェクトを保持するボックスと考えています。すると、たとえばa = b、 にあったものはすべて にbコピーされaます。これは JavaScript の動作方法ではありません。

代わりに、JavaScript はオブジェクトをどこかに置くことで機能し、変数はそのオブジェクトを指します。次に、と同じオブジェクトを指すようになりましa = bた。のプロパティが変更されると、それらが指しているオブジェクトが同じであるため、 の同じプロパティが変更されます。abba

コピーを作成する場合a = bは、明示的に行う必要があります。たとえば、プロパティfoobarがある場合、次のようにすることができます。

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

ただし、これは 1 レベル下にコピーするだけなので、 もb.fooオブジェクトである場合、 はa.fooと同じオブジェクトを参照し、 のb.fooプロパティをa.foo変更すると にも同じ変更が表示さb.fooれます。

于 2013-03-03T21:17:05.077 に答える