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 文件一次并将其加载到变量中是安全的,比如在 index.html 中,然后导航到其他 html 而不会丢失该变量值(xml 文件)?

谢谢!!

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变量。

或者,就像下面建议的那样,只需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 在执行时执行底层工厂方法一次,存储它的结果并返回一个只返回该结果的函数。您甚至可以使用以下方法进行延迟加载:

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

PS:不要担心使用通常的lock东西进行多线程处理,以使单例代码线程安全。JavaScript 只在一个循环中执行代码(这就是我们到处都有回调的原因)

于 2013-02-14T12:00:37.937 回答