2017-01-19 15 views
1

すぐに呼び出された関数式でjsコードをラップした後に何らかの理由でprogressBar not definedが表示されます。なぜこれが当てはまるのだろうか?関数がsetTimeoutを使用して定義されていません

(function(){ 
    "use strict" 

    var progressBar = function(){ 
     var bar = document.getElementById('pbar'), 
     status = document.getElementById('status'), 
     barValue = bar.value; 

     status.innerHTML = barValue + "%"; 
     bar.value++; 

     var increment = setTimeout("progressBar()", 50); 
     if(bar.value == 100){ 
      status.innerHTML = '100% - Straight Besting'; 
      bar.value = '100'; 
      clearTimeout(increment); 
     } 
    } 

    progressBar(); 

})() 

答えて

5

あなたはsetTimeoutに文字列を渡すと、それはグローバルwindowオブジェクトのコンテキストで呼び出されます。

変更setTimeoutラインへ:

var increment = setTimeout(progressBar, 50); 

例えば面白いザッツ

(function() { 
 
    let i = 0; 
 
    let myfunction = function() { 
 
     console.log(i++); 
 
     if (i < 10) setTimeout(myfunction, 100); 
 
    }; 
 

 
    myfunction(); 
 
})()

+0

、なぜそうではありますか?なぜ、関数がsetTimoutの最初の引数に文字列として渡されたのですか?スコープではなくグローバルのコンテキストで呼び出されますか? –

+1

'setTimeout'は実際には' window.setTimeout'です。文字列を渡すと、 'eval'と同じように、実際には" code "の文字列を渡して実行します。 「コード」にはコンテキスト情報は含まれていません。 – noahnu

関連する問題