経験則は、所有していないものを変更しないことです。代わりに、このアプローチを例として検討してください。
var myObj = {};
var xhr = new XMLHttpRequest();
myObj.xhr = xhr;
myObj.customProperty = 4;
myObj.customFunc = function () {
// use this.xhr
}
// Now pass myObj around instead, you have a reference to xhr (myObj.xhr)
// and your customProperty (myObj.customProperty).
JavaScript でクロージャーがどのように機能するかにより、関数を定義したときにスコープ内にあった変数にもアクセスできる必要があります。これにより、コンテキストonreadystatechange
の必要性が完全になくなります。this
var xhr = new XMLHttpRequest();
var something = function () {
// I have access to "xhr" because of closures.
};
xhr.onreadystatechange = function () {
if (this.readyState === 4 && this.status === 200) {
// I still have access to "something" here because of closures;
}
}
// xhr.open && send.
... 側にクロージャーがない場合でも (たとえば、onreadystatechange
が別のスコープで定義されている場合)、作業を行うために必要な変数を渡すことができるようにコードを変更することを検討する必要があります。