Buzzurlの中の人日記

http://d.hatena.ne.jp/amachang/20060910/1157911122


を見て。



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



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

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


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


[javascript]JavaScript を学ぶ際に一番重要なのに、誤解されがちな setTimeout 系の概念


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


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


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


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


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


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




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


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


この記事にコメントする
お名前
タイトル
文字色
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
プロフィール
HN:
ajiyoshi
性別:
男性
自己紹介:
プログラマです。
ソーシャルブックマークサービス「Buzzurl」の開発者です。

はてなブックマークカウンタ


旧*「ふっかつのじゅもんがちがいます」カウンタ
Buzzurl

powered by Buzzurl

Twitter

カレンダー
08 2010/09 10
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
最新コメント
[07/23 つらら]
[07/23 れいら]
[06/16 婚活]
[05/28 あっだ]
[05/28 もも]
最新トラックバック
バーコード
ブログ内検索
忍者ポイント
カウンター
アクセス解析
あわせて読みたい
あわせて読みたい
Powered by ニンジャブログ  Designed by ゆきぱんだ
Copyright c *「ふっかつのじゅもんがちがいます。」 All Rights Reserved
ブログ / [PR]引越し 不動産