「同期動作」は必要ありません。代わりに、あなた (開発者) は、JavaScript の非同期の性質、特に匿名コールバックの使用方法とクロージャの処理方法について頭を悩ませる必要があります。
たとえば、これを行っている場合:
function doSomething(arg) {
var number = arg + 10; // for example
var data = getDetail();
data = JSON.parse(data);
element.innerHTML = number + ': ' + data.name;
}
function getDetail() {
var xhReq = new XMLHttpRequest();
xhReq.open("POST", "ClientService.svc/REST/GetDetail", false); // bad!
xhReq.send(null);
return xhReq.responseText;
}
非同期的に書くことができます:
function doSomething(arg) {
var number = arg + 10;
getDetail(function(data) {
data = JSON.parse(data);
element.innerHTML = number + ': ' + data.name;
});
}
function getDetail(cb) {
var xhReq = new XMLHttpRequest();
xhReq.open("POST", "ClientService.svc/REST/GetDetail", true);
xhReq.onreadystatechange = function() {
if (xhReq.readyState == 4) cb(xhReq.responseText);
}
xhReq.send(null);
}
非同期の例では、内部のコールバック関数 (ネットワーク リクエストが完了した後にのみ実行される) がまだ外部関数のnumber
変数にアクセスできることに注意してください。これは、JavaScript が静的スコープを持っているためです。つまり、関数を宣言すると、その関数は、その関数を囲む関数の変数に永続的にアクセスできます。