0
var mapFile = new XMLHttpRequest();
mapFile.open("GET", "http://localhost:8000/res/map01.txt", true);

mapFile.onreadystatechange = function() {
  if (mapFile.readyState === 4) {
    if (mapFile.status === 200) {
      this.lines = mapFile.responseText.split("\n");
    }
  }
}

this.lines = mapFile.onreadystatechange.lines;

mapFile.send(null);

私はそのコードを持っており、後で外部スコープとして保存するためthis.linesに内部に保存しようとしています。ただし、は未定義であり、後で使用するために変数を保存することはできません。私はこれの汚いハックであるものを使ってみましたが、それもうまくいきませんでした。mapFile.onreadstatechangethis.linesmapFile.onreadystatachange.lineselement.innerHTML

4

1 に答える 1

2

ここには3つの主要な問題があります。

  1. this関数内は関数の呼び出し方法によって決定されるため、内部は関数の外部onreadystatechangeと同じではありません。私のブログの詳細:神話上の方法| 覚えておく必要がありますthisthisthis

  2. XHR呼び出しは非同期this.lines(デフォルト)であるため、呼び出しのすぐ上で使用しようとしているときは、コールバックはまだ呼び出されていませんsend。(同期要求があっても、その行は sendにあるため、設定されません。)

  3. mapFile.onreadystatechange.lineslinesによって参照される関数オブジェクトで呼び出されるプロパティを探しますmapFile.onreadystatechange。その関数で定義された変数とはまったく関係ありません。

主な項目に対応するアップデートは次のとおりです。

var mapFile = new XMLHttpRequest();
var self = this; // <===== Remember `this` for use in the callback
mapFile.open("GET", "http://localhost:8000/res/map01.txt", true);

mapFile.onreadystatechange = function() {
  if (mapFile.readyState === 4) {
    if (mapFile.status === 200) {
      // v---- Use self instead of this
      self.lines = mapFile.responseText.split("\n");
    }
  }
}; // <=== Add missing semicolon

// Removed a line here using `this.lines` prematurely

mapFile.send(null);
于 2013-02-02T12:09:10.147 に答える