在教科书中找到以下功能。它应该可以创建最新版本的XHR对象。
function createXHR(){
if (typeof arguments.callee.activeXString != "string"){
var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
i, len;
for(i=0, len=versions.length; i<len; i++){
try {
new ActiveXObject(versions[i]);
arguments.callee.activeXString=versions[i];
break;
}catch(ex){
//skip
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}
我的问题是:为什么我们不能只返回for-loop中的对象?像这样:
function createXHR(){
if (typeof arguments.callee.activeXString != "string"){
var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
i, len;
for(i=0, len=versions.length; i<len; i++){
try {
arguments.callee.activeXString=versions[i];
return new ActiveXObject(versions[i]);
}catch(ex){
arguments.callee.activeXString = undefined;
}
}
}
}
这两个似乎与我相同。
答案 0 :(得分:2)
为什么我们不能在for-loop中返回对象?
你当然可以。 (在第二个例子中,break;
是不必要的。)
但是,您需要允许第二次,第三次等调用createXHR
,这是您当前的第二个代码块没有的。如果已经拥有activeXString
(例如,else
),则需要执行new ActiveXObject(arguments.callee.activeXString)
。
如果它们都不起作用,我还建议抛出错误。
请注意,这只是过时的,仅限IE浏览器。创建XHR对象的正确方法是:new XMLHttpRequest(...)
仅当XMLHttpRequest
不存在时,您才会依赖这些过时的方法(例如,如果您需要支持IE8)或IE9-IE11处于破碎的兼容模式&#34;)。
另一个注意事项:在该代码中始终不需要使用arguments.callee
,并且它不再适用于严格模式(严格模式是您想要使用的)。相反,只需使用createXHR
:createXHR.activeXString = ...
例如:
function createXHR() {
if (typeof XMLHttpRequest !== "undefined") {
return new XMLHttpRequest;
}
// Obsolete-IE-only fallbacks
if (typeof createXHR.activeXString != "string") {
var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
i, len;
for (i = 0, len = versions.length; i < len; i++) {
try {
createXHR.activeXString = versions[i];
return new ActiveXObject(versions[i]);
} catch (ex) {
createXHR.activeXString = undefined;
}
}
throw new Error("No XHR available");
} else {
return new ActiveXObject(createXHR.activeXString);
}
}