2012-01-31 6 views
0

「ハンズオンノード」から次の例を取り上げました。これは、いくつかの合理的に高度な技術を使用します。コードを逐語的にコピーして、何度かデバッグしようとしましたが、何も私のコンソールに何も印刷されない理由を理解できません。次のJavaScript関数で何も印刷されないのはなぜですか?

var schedule = function(timeout, callbackfunction) { 
    return { 
     start: function() { 
      setTimeout(callbackfunction, setTimeout) 
     } 
    } 
}; 

(function() { 
    var timeout = 1000; 
    var count = 0; 
    schedule(timeout, function doStuff() { 
     console.log(++ count); 
     schedule(timeout, doStuff); 
    }).start(timeout); 
})(); 
+7

setTimeout(callbackfunction、setTimeout)のコードに誤字があると思われます.2番目のパラメータは "timeout"にする必要があります – ggreiner

+1

うーん、この本以外の学習リソースを使用することをお勧めします... – maerics

答えて

4

別に代わりに、これはループにタイマーを意味している場合は、を(まだそれが一度に実行できるようになります)timeoutsetTimeoutを渡してから、その後、欠陥があります。

コードは初めて初めて.start()を呼び出しません。あなたはこれをする必要があります...

私は誰かがこのアプローチを採用する理由はわかりませんが、それはあまりにも複雑です。


私は、なぜ彼らはinital .start()timeoutを集めても、わかりません。その関数は渡された引数を使用しません。私はそれを削除するように更新しました。


これがクロージャの利点について教えていたのであれば、この例では実際にはほとんど行いません。

はい、.start()機能はtimeoutcallbackfunctionパラメータを参照したが、返されるオブジェクトは、一度使用され、我々は同じ引数を再度scheduleを呼び出し、それを通過する時点で、廃棄されます。

scheduleが関数を返されたばかりであり、その関数への参照を保持していれば、デモンストレーションとして役立つようです。値を保持するには、scheduleへの1回の呼び出しだけが必要です。

var schedule = function(timeout, callbackfunction) { 
    return function() { 
     setTimeout(callbackfunction, timeout) 
    } 
}; 

(function() { 
    var count = 0; 
    var fn; 
    (fn = schedule(1000, function doStuff() { // 1. assign the function returned 
     console.log(++ count); 
     fn(); // 3. invoke the same function again 
    }))(); // 2. invoke the returned function immediately 
})(); 
+1

右。 'setInterval'誰ですか? –

1

「スケジュール」関数によって返された匿名で「スタート」機能は、タイプミスを持っている - それは、引数「タイムアウト」と「setTimeoutメソッド」ではなく、「setTimeoutを」呼び出す必要があります:

var schedule = function(timeout, callbackfunction) { 
    return { 
    start: function() { 
     setTimeout(callbackfunction, timeout); // Fix the second arg. 
    } 
    } 
}; 

また、 "doStart()"関数呼び出しは、匿名の "start()"関数を再度呼び出すことはないので、log文は一度だけ実行されます。

関連する問題