2016-08-02 12 views
-1

私はJavaScript関数のシーケンスについて質問があります。私は以下の2つのコードを持っています。なぜこれら2つのプログラムの異なる結果ですか? 最初のプログラムの結果は2番目のプログラムの結果と等しいと思います。javascript関数の実行順序

function test1() { 
    for (var i = 1; i <= 1000000; i++) { 
    } 
    console.log("test1"); 
} 

function test2() { 
    console.log("test2"); 
} 

test1(); 
test2(); 
//test1 
//test2 

function test1() { 
     setTimeout(function() { 
     console.log("test1"); 
     }, 1000); 
    } 

function test2() { 
    console.log("test2"); 
} 

test1(); 
test2(); 
//test2 
//test1 
+0

ループ実行中の 'setTimeout'は非同期です。これは違いです。 – Thomas

答えて

0

setTimeoutMDN | spec)の目的ため、非同期、後でを機能への呼び出しをスケジュールすることです。したがって、2番目の例では、test1を最初に呼び出すと、匿名コールバックの呼び出しを2番目に後でスケジュールしてから戻ります。それからすぐにtest2と呼んでください。 2番目のコールバックはタイマーによって呼び出され、test1を出力します。

はおそらく、あなたの第二の例には、この小さな微調整は、それがより明確になります。

function test1() { 
 
    console.log("test1 called, setting up timer"); 
 
    setTimeout(function() { 
 
    console.log("timer fired and called the callback"); 
 
    }, 1000); 
 
} 
 

 
function test2() { 
 
    console.log("test2 called"); 
 
} 
 

 
test1(); 
 
test2();
あなたはこの出力を参照してください

(最後の行のみ秒後に表示されます):

 
test1 called, setting up timer 
test2 called 
timer fired and called the callback 
0

setTimeoutは非同期操作です。この番号は、コードが実行される遅延を定義するために使用されます。あなたは結果に異なっ

0

http://javascript.info/tutorial/settimeout-setinterval チェックこのアウト マベを見ているよう1000が、それは多分あなたの現在のスレッドがあなたの「ため」ループに捕まってしまった、私の意見では:)

+1

このリンクは質問に答えるかもしれませんが、ここに答えの重要な部分を含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 – ekad

0

を助ける、遅延あり最初のコードスニペット。しかし、この操作は2番目のコードスニペットで非同期に行われます。