我是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中,然后导航到其他htmls而不会丢失该变量值(xml文件)?
谢谢!
答案 0 :(得分: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。
答案 1 :(得分: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只在一个循环中执行代码(这就是为什么我们在整个地方都有回调)