2017-02-18 6 views
0

私の質問は、なぜ関数の結果がブラウザのforループの前に表示されるのですか?ループ(1、2、3、4、5)のために実行する必要がありますが、最初に( 'cool'と1!2!3)を実行するので、コードとコンソールの結果を追加します。誰かがこの行動を私に説明できるなら、とても感謝しています。重複しているわけではありません。私はそれがどのように機能するのか理解したいのです。提案された質問には、最初にsetTimeoutを使ってループを実行するソリューションがありますが、動作を完全に説明することはできません。他の後のコード1のブロックを実行して動作するJavaScriptforループの実行前に関数の結果が表示される

// Loops + Closure 
for (let i = 1; i <= 5; i++) { 
    setTimeout(function timer() { 
     console.log(i) 
    }, i * 1000) 
} 

//Modules 
function CoolModule() { 
    let something = 'cool' 
    let another = [1, 2, 3] 

    function doSomething() { 
     console.log(something) 
    } 

    function doAnother() { 
     console.log(another.join('!')) 
    } 

    return { 
     doSomething: doSomething, 
     doAnother: doAnother 
    } 
} 

let foo2 = CoolModule() 

foo2.doSomething() // 'cool' 

foo2.doAnother() // 1 ! 2 ! 3 

console result

+1

forループは有効期限が切れるまで何も出力しないタイマーの束を起動するので、なぜあなたは何か違うことを期待しているのか分かりません。 –

+2

それは明白ではありませんか? 'setTimeout'は1秒の遅れで始まります。残りのコードは1秒未満で実行されます – Amy

+4

setTimeoutは何かを混乱させる可能性がありますか?実行をブロックしません。 –

答えて

0

。したがって、forループで始まり、foo2.doAnother()で終わる1ブロックのコードがあります。しかし、setTimeoutへの呼び出しはすぐにはコードを実行しません。つまり、新しいコードブロックをキューに入れます(console.log(i)ブロック)。だからあなたのコードはもっとよく似ています。

  1. 5つの 'タイマー'機能をキューに入れます。それぞれが実行される前に、1秒、2秒、3秒などを待機しなければならず、それぞれは現在のブロックの後に実行する必要があります。
  2. 'CoolModule'コードを実行します。
  3. (あなたが実行終了を書いたコード)
  4. (1Sを待つ)
  5. timer()
  6. の最初のインスタンスを実行します(別の1秒を待つ)
  7. timer()
  8. などの2番目のインスタンスを実行します。..
+0

これは特別な動作ですブロック内で実行するすべてを待つsetTimeout()の処理を開始しますか? – BlackB0ne

+0

ええ - setTimeoutは 'この関数を後で実行する'と言っています - 関数を作業キューに入れます。しかし、キュー内の何かをする前に、コードの残りの部分の実行が終了します。 –

関連する問題