JavaScriptがシングルスレッドなのは仕様?

http://d.hatena.ne.jp/amachang/20060910/1157911122
を見て。


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


setTimeout(function() { alert("hello") }, 10);

〜ここに重くて、1秒の時間を有する処理を書く〜

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

おっしゃるとおり、僕の知ってる範囲内のJavaScript環境はすべて今実行している関数がブラウザに制御を返すまで、setTimeoutやsetIntervalに割り込まれることはないですね*1

もっと言うと経験則的にはJavaScriptが実行中はブラウザの描画も行われません。だからinnerHTMLに大量のHTMLを突っ込むとかの重い処理を頻発するページは糞重い上に固まってるように見えます。

つまり、経験則的にはブラウザのレンダリング処理を含めてJavaScriptの実行はシングルスレッドで行われるように見えます。これが分かってないと重い処理にプログレスバーをつけようとしたときに、安直な書き方だと期待通りに動かなくてハマります。*2

この、JavaScriptがシングルスレッドなのって仕様で定められてるのですかね?

ECMAScriptの仕様を見れば載ってるのかもしれないけど、Cの仕様にシングルスレッドで動作するなんて書いてないようにECMAScript仕様にもそんなこと書いてないような気がしてちゃんと調べてないです。(「仕様に書いてない」ことを調べるのは面倒だし)
誰かちゃんとしたことを知ってる人がいたら教えて欲しい今日この頃です。

*1:経験的には、「ブラウザに制御を返すまで」なので、重箱の隅をつつくと上の例は1000ミリ秒後とは限らないですね。1秒の時間を要する処理が終わった後、return先がブラウザじゃなくてまた別な関数だったらもっと遅くなり得ます。

*2:一方描画も含めてシングルスレッドだから、JavaScriptの実行中にブラウザや他のスレッドがDOMツリーを変更したりするレースコンディションの可能性を考慮しなくて済むわけですが。