0

ボタンをクリックするとトリガーされるJavaScript関数がたくさんあります。したがって、次のような2つのメソッドをトリガーする2つのボタンがあると仮定します。

 var universal = false;
    var collection = Array(); // assume it has 5 data elements( 0...4) upon page load

    function next()
    {
      if(universal)
         addToArray();

       // do whatever else
    }

    function addToArray()
    {

        console.log(collection);
       // perform some DOM calls,that simply Hide/change position of elements
       var newElement = 'some info';   
       collection.push(newElement);
    }

上記のaddToArray()関数では、「次へ」ボタンがクリックされ、ユニバーサル変数がtrueに設定されたときに呼び出されます。この時点で、addToArray()メソッドを入力し、console.logを呼び出して「コレクション」をチェックアウトします。

addToArrayは最終的にコレクションに要素を追加しますが、最初は正しくないため、これはどの時点でも5要素を超えないようにする必要があります。ただし、console.logには、コレクションに新しい要素が追加されていることが示されています。これは、実際にはaddToArray method()中に追加されるはずであり、すぐには追加されません。

私はこれが本当に間抜けに聞こえることを知っています、しかしこれは私が得ているものです。非同期動作がそれと関係があるかどうかを理解しようとしています。

4

2 に答える 2

2

Chromeを使用している場合、その理由は、後で変更したときにコンソールウィンドウで更新されるオブジェクトのライブconsole.logバージョンをログに記録するためです。

変更した場合

console.log(collection);

...に

console.log(collection.join(","));

...またはおそらくもっと便利に

console.log(JSON.stringify(collection));

...アレイのポイントインタイムバージョンが表示されます。

の動作console.logは実際にはかなりトリッキーですが、頭を回すと一貫性があります。たとえば、次のコードについて考えてみます。

var a = [1, 2, 3];

console.log("first");
console.log(a);
console.log("second");
a[0] = '11';
a = ['a', 'b', 'c'];
console.log("third");

ライブコピー| ソース

それを実行するときにコンソールを開いている場合は、次のように表示されます。

最初の
[1、2、3]
2番目
第3

...クリックしても、インデックスに配置されたコード[1, 2, 3]は表示されません。ましてや、新しい配列は表示されません。"11"0a

しかし、あなたが変更した場合

var a = [1, 2, 3];

...に

var a = [[1, 1], 2, 3];

ライブコピー| ソース

...あなたはこれを見ます:

最初の
>[Array[2]、2、3]
2番目
第3

...そして配列の横にある矢印をクリックすると、次のように変更されます。

最初の
v[Array[2]、2、3]
    0:「11」
    1:2
    2:3
    長さ:3
    __proto__:配列[0]
2番目
第3

...これは少し無意味に見えます。

しかし、それは理にかなっています。コンソールが出力を要求したものを参照しているという観点から考える必要があります。モノの線を出力し、その線は静的です。しかし、オブジェクトグラフが深くなっていることがわかったため、Chromeは配列の横に矢印を配置して、配列を展開できるようにしました。配列をクリックすると、出力に追加された新しい行が生成されます。最初の行が出力されてから明らかに変更された、現在のバージョンのオブジェクトを確認します。トリッキー、え?

コメントの中で、epascarelloはconsole.dir代わりに使用することに言及していますが、それはそれを特定の時点の記録ではなく、さらに確実に「ライブ」にするだけです。

于 2012-12-17T22:42:17.950 に答える
0

あなたの問題はおそらくそれconsole.logが非同期であるということです。コメントアウトするか、その行にタイムアウト/ブレークポイントを入れてみてください。

于 2012-12-17T22:44:51.120 に答える