1

セットアップ: こんにちは。オブジェクトの作成/インスタンス化について学習しようとしています。私は、作成された順序に関係なく、類似した作業 (ニュース記事の収集など) の量が異なる可能性があり、「完了を報告」する複数のオブジェクトを作成できるはずだと考えていました。これまでのところ、これについては明確ではありません。基本的な例とそれに続く質問を次に示します。

function test(count){
    this.count = count;
    for(var i = 0; i< count; i++){}
    console.log(i);
}

new test(1000);
new test(10);

実際の質問:

上記のコードに基づいて、2 番目のインスタンスが最初に印刷されることを期待しますが、そうではありません。どのオブジェクトが作業を終了しても最初に印刷されるように、これを設定する正しい方法は何でしょうか?

* 質問を修正してください* 申し訳ありません...私が本当に質問したいのは、オブジェクトを設定してより非同期の動作をさせる方法です。私はスタックが初めてなので、この質問を閉じる/移動する必要があるかどうか教えてください。

4

4 に答える 4

1

異なる並列実行スレッドを作成していません。最初のスレッドtest(1000)は、次の行が始まる前に完全に実行されます。

Javascript では、webworker を使用していない場合 (おそらく使用すべきではありません)、すべてのコードは常に単一のスレッドで実行されます。このスレッドは、イベントが発生するとブラウザによって起動され、ブラウザによって呼び出された関数が戻るとスリープ状態に戻ります。

スレッドであっても、自然に並列な言語であっても、どのループが最初に終了するかについての保証はほとんどないことに注意してください。

于 2013-01-26T09:12:05.457 に答える
1

一般に、JavaScript は同期実行モデルであるイベント キューを使用します。すべての呼び出しは、基本的にソース コードに表示される順序でここに配置されます (スコープを考慮して)。

したがって、何らかの関数を開始すると、その関数が終了するまで何も実行されません。あなたの場合、両方の呼び出しをイベント キューに配置しますが、2 番目の呼び出しは、最初の呼び出しが終了したときにのみ実行されます。

ただし、例外があります: WorkerまたはAJAX requests

ここでは、実行は通常のイベント キューの外にあり、実行が終了した後、メッセージ ハンドラーまたはコールバックを使用して結果を使用します。ただし、ほとんどの場合、実行の順序に影響を与える多くの状況 (ネットワーク遅延、CPU 使用率など) があるため、呼び出しがどの順序で終了するかはわかりません。

あなたの場合、とにかく外部リソースをロードしたいようです。それでは、AJAX の仕組みを見てみましょう。

于 2013-01-26T09:12:30.707 に答える
1

2 番目のインスタンスが最初に出力されない理由はnew test(1000)、次の行の実行が開始される前に、最初の呼び出しが完了するまで実行されるためnew test(10)です。

2 番目の呼び出しを最初に実行する場合は、2 つの行を入れ替えます...

編集:ちなみに、まともなコンパイラはこの行を完全に削除します:

for(var i = 0; i< count; i++){}

したがって、最初の呼び出しが 2 番目の呼び出しよりも時間がかかるとは期待できません...

于 2013-01-26T09:12:51.167 に答える
1

2 番目のインスタンスは、最初のオブジェクトがインスタンス化された後にのみインスタンス化されます。 シングルスレッドプログラムなので
、最初に1000を出力しますnew test(10)

于 2013-01-26T09:13:02.440 に答える