set Timeout()とset Interval()が関数を呼び出した時に失効する可能性のある理由


set Timeout()とset Interval()は、javascriptにおいて循環呼び出しを実現する2つの重要な方法である.
(1)var timeoutID=setTimeout(excute.time)
この関数の基本的な機能は、一定時間後に文または関数を実行するように設定されています.
主に二つのパラメータがあります.
        excuteは、ある期間後に実行する必要があるjs文または定義済みのjs関数functionです.
        タイムは設定の間隔時間で、単位はmsです.
戻り値:
        timeoutIDはこのtimeoutタイマのID値を返します.このID値を借りるとclearTImeout()を使ってこのtimeoutを停止できます.
よく使われるsetTimeout()を使用する方法は以下の通りである.
function cycle(){
//the funtion body
timeId=setTimeout(「cycle()」、1000)
)
timeId=setTimeout(「cycle()」、1000)
このようにすれば1000 ms(=1 s)を超えるごとに、依希薄cycle関数の関数体部分を実行することができます.
簡単な例を挙げると、カウントやタイミングが実現できます.
(2)var ID=setInterval(execute、time)
この関数の基本的な機能は、時間が過ぎるごとに、文またはjs関数を実行するように設定します.ページが閉じるまで、またはclear Interval(ID)を使って停止します.
主に二つのパラメータがあります.
        excuteはサイクル実行が必要なjs文または定義済みのjs関数functionです.
        タイムは設定の周期間隔時間で、単位はmsです.
戻り値:
        IDは、このINtervalタイマーのID値を返します.このID値を借りると、clear Interval()を使って、このintervalを停止します.
同じように最近setTimeout()関数を使う時に問題が発生しました.
問題:setTimeout(func,time)を使用する.その後は対応機能が実現されていません.
コード:
		function send_video() {
            var blob = send_blob;
			if(!blob) return;
			size = blob.size;
			startIndex = 0;
			plus = 10000;

			console.debug('one chunk size: ');

			function inner_streamer() {
				reader = new window.FileReader();
				reader.onload = function (e) {
					var send_data = new window.Uint8Array(e.target.result);
					myconn.send({type:"video_seg",content:send_data});
					startIndex += plus;
					if (startIndex <= size)
					{
						setTimeout('inner_streamer()',100);
					}
					else {
						myconn.send({type:"video_com",content:"end"});
					}
				};
				reader.readAsArrayBuffer(blob.slice(startIndex, startIndex + plus));
			}
            console.debug("begin to transfer data!");
			inner_streamer();
        }
理由:setTimeout()とsetInterval()の二つの関数には共通の特徴があります.もしそれがjs関数を実行するなら、この関数は大域関数であり、特定の関数の内部の関数ではありません.
解決方法:内部のinnerをstream()send_に言及します.video()関数の外で、グローバル変数を使っていくつかのパラメータを転送します.