[javascript] 変数のスコープとか、非同期通信とか

ろくにjavascriptも知らずにuserscriptを書き始めた。ほんのちょっとした内容のスクリプトを書くのにも何度もつまずいた。でもいい勉強になった。何事も新しいものを取得するときには動くものを作るのが一番いいことを再認識した。本とか読んだだけど頭でがーーーって組めればいいんだけどまぁそんな頭は持っていない。こつこつ地道に試すのが僕にはあっている。

んで本題。
こんな感じのスクリプトを書いていた。

var hoge = 'default'

// とある条件の場合hogeを書き換え
GM_xmlhttpRequest({
    method: 'GET',
    url:   'http://www.hoge.com',
    onload: function(details) {
	hoge = details.responseText
    }
});

// このあとでhogeを使って処理

僕の頭の中では上から順番に処理されると思っていたので当然hogeは書き換えられていると思っていた。javascriptがよくわかってないのであぁ変数のスコープかなぁと考えて調べるがどうやら違う。GM_logをそれぞれのポイント吐いてみるとなんか変な順番でlogが出てくる。それでも僕は気がつかない。その後やっと気がついた。非同期処理だってことを。

setTimeoutでその後の処理を遅らせてみたが時間なんて回線にもよるだろうしうまくいかない。というか非同期の意味が無くなるのでは?とも素人ながらに考えている。はずかしいけどソースをさらす。

どんな書き方が一般的なのかこの辺がよくわかってない。もっと人のソースを読まなければ。
分からないことだらけだからよくリファレンスを引く。さくさく引けるリファレンスが欲しい。メソッドもがしがし補完してほしい。emacs+firefox+firebugで開発したのだけどfirebugももっと便利な使い方がいっぱいあるはずだ。