読者です 読者をやめる 読者になる 読者になる

JavaScriptのsetTimeoutについて

JavaScript を学ぶ際に一番重要なのに、誤解されがちな setTimeout 系の概念
http://d.hatena.ne.jp/amachang/20060910/1157911122
上記はてブコメント
http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/amachang/20060910/1157911122

JavaScriptがシングルスレッドなのは仕様?
http://d.hatena.ne.jp/ajiyoshi/20060911


でsetTimeoutの仕様について熱く語られている.私も興味を持ったのでざっと調べてみた.


まず超基本的な話としてマルチプロセスなOSにおいて完璧な
時間制御というものは無理ということだ.これは話を極端にして


「1万個ブラウザ立ち上げてきっちり1msecごとになにかをさせようとしたらちゃんと動くか?」


ということを考えてみても明らかだ.Windowsならもしかしたらそういう
ハードなタイマ割り込みがかけられるのかもしれないけれど,
少なくともUnix系では機構的にそこまで厳密なタイマは仕掛けられない.

というわけで

たとえば、以下のようなソースの場合、hello と表示されるのはいつだろうか

setTimeout(function() { alert("hello") }, 10);
〜ここに重くて、1秒の時間を有する処理を書く〜


答えは 1000 ミリ秒後である。確実に 1000 ミリ秒後である。

に関しては「確実とは限らない」が正解だと思う(ウソかもしれないので反論求む).


で私が興味を持ったのがsetTimeoutがどう仕様に盛り込まれているかだ.


JavaScriptECMAScriptという形で規格化されているが,ECMAScript
汎用言語なので仕様としてはほんとに言語セット(基本データタイプと
文法くらい?)だけしか規定しておらず,setTimeoutなどの環境によっては
まったく意味を持たないものに関しては仕様からははずれている.


でsetTimeoutなど外部環境の話に関してはブラウザでしか意味が
ないことなので,W3CでWorking Draftとして提出されているが
実装に関しては規定されていないのが現状のようだ.
たぶんこのあたり.

http://www.w3.org/TR/
http://www.w3.org/TR/2006/WD-Window-20060407/

誰かちゃんとしたことを知ってる人がいたら教えて欲しい今日この頃です。

これはみんな思ってることだと思われる.Firefoxに関してはソースをあたるとして問題はIEだ.
IE4の開発者の一人であるUIEvolutionの中島さんあたりが答えに近い位置にいそうだけど,
知ってそうな人に頼るのではなく,ここはインターネットなのでみんなの知恵を寄せ合って,
真実を突き止めるのが筋だと思うのだった.集合知集合知.

2007/09/06追記

深追いした記事が出たので紹介
http://labs.gmo.jp/blog/ku/2007/09/firefoxsettimeout.html

(おしまい)

yamaz的日常

私がBlogをはじめるにあたって必ず書こうと思っていた
9/11とAkamai Technologies社
がやっと書けた.Akamaiの方々には間接的にすごく恩を感じてるので,外に出せてほっとした.


「コネクションプーリング都市伝説」はほんとに都市伝説?(その1)
の続きをかいてるけど,話が発散しすぎてどうにもうまくまとまらない..
というわけで気長に待っててください > 一部の方々