JavaScript では、クロージャーは、それを含む関数の変数にアクセスできるネストされた関数として定義できることを知っています。例えば:
function outerFunction(x, y) {
function innerFunction() {
return x + y + 10;
}
return innerFunction;
}
onreadystatechange
次のコードは、リクエスト オブジェクトのプロパティのコールバックを接続しています。ただし、定義により、これもクロージャーと見なされるかどうか疑問に思っていました。
/* This is a contrived example, I know.
* Bear with me - it demonstrates the point I'm trying to convey. */
function submitHandler() {
var oRequest = createRequest(); // assume I'm getting an instance of the xhr
var sUsername = 'Tom'; // assume this is needed for work in the handler
var This = this;
oRequest.onreadystatechange = function() {
This.handleResponse(oRequest, sUsername)
}
}
function handleResponse(oResponse, sUsername) {
if(oResponse.readyState === 4 && oResponse.status === 200) {
// do work with the username
} else {
// we're not done yet...
}
}
このhandleResponse
関数は のコンテキストで無名関数として記述することもできsubmitHandler
ますが、コールバックをコールバックする関数のスコープ外でコールバックを定義すると、より複雑な Ajax コードをより読みやすく、簡単に保守できることがわかりました。繰り返しますが、これは私の質問の要点を単に示すことを期待して私が使用している不自然な例です。