3

私は JavaScript が初めてで、同じ変数のインスタンスを繰り返し取得する適切な方法がわからないことがわかりました。私はこれでXmlファイルを開いています:

function testXML(){
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.open("GET","../res/data.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
return xmlDoc;
}

戻り値を追加したので、その xml ファイルを選択して検索を行い、いくつかのリストにデータをロードできます。問題は、データを読み取るためにxmlファイルを取得するたびに、このメソッドを呼び出すことです.xmlを返すだけでなく、IF / Elseやopenfileなども実行します...そうではないと思いますその適切な。

では、xml ファイルを返すだけのメソッドを作成して、一度しか開くことができないようにするにはどうすればよいでしょうか。また、xml ファイルを 1 回開いて変数 (たとえば index.html) にロードし、その変数値 (xml ファイル) を失うことなく他の html に移動しても安全ですか?

ありがとう!!

4

2 に答える 2

5
var xml;

function testXML(){
    if(!xml){
        if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        } else {// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.open("GET","../res/data.xml",false);
        xmlhttp.send();
        xml = xmlhttp.responseXML;
    }
    // return xml; // You can optionally also return the xml, but it'd be assigned to the variable already, any way.
}

xmlその関数を 1 回呼び出すだけで、変数を使用できます。

または、以下で提案されているようtestXML()に、コード内の変数の代わりに使用し、戻り値のコメントを外します。
これにより、未定義の xml に遭遇することがなくなります。

于 2013-02-14T11:53:53.060 に答える
2

これを実現するには、JavaScript で関数クロージャーを使用することをお勧めします。

function createSingleton(fn) {
  var singleton = fn.apply(this);
  return function () {
    return singleton;
  };
}

これは、何かを返す他の関数からシングルトンを作成する汎用関数です。その結果は関数クロージャー内に格納され、結果の関数を何度でも実行してシングルトンに到達できます。その関数を渡すことが心配な場合は、グローバル オブジェクトに格納するだけです。

var xml = createSingleton(getXML);

console.log(xml()); //use the xml object
console.log(xml() === xml());

ここで実際に起こることは、実行時に createSingleton が基になるファクトリ メソッドを 1 回実行し、その結果を格納して、その結果のみを返す関数を返すことです。これで遅延読み込みを行うことさえできます:

function createSingletonLayz(fn) {
  var singleton = null,
      context = this;
  return function () {
    if (!singleton) {
       singleton = fn.apply(context)
    }
    return singleton;
  };
}

lockPS:シングルトン コードをスレッド セーフにするための通常の方法で、マルチスレッドについて心配する必要はありません。JavaScript はコードを 1 回のループでしか実行しません (そのため、あちこちにコールバックがあります)

于 2013-02-14T12:00:37.937 に答える