在哪里返回创建的XHR对象

时间:2017-10-13 10:58:30

标签: javascript

在教科书中找到以下功能。它应该可以创建最新版本的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;
            }
        }

    }
}

这两个似乎与我相同。

1 个答案:

答案 0 :(得分:2)

  

为什么我们不能在for-loop中返回对象?

你当然可以。 (在第二个例子中,break;是不必要的。)

但是,您需要允许第二次,第三次等调用createXHR,这是您当前的第二个代码块没有的。如果已经拥有activeXString(例如,else),则需要执行new ActiveXObject(arguments.callee.activeXString)

如果它们都不起作用,我还建议抛出错误。

请注意,这只是过时的,仅限IE浏览器。创建XHR对象的正确方法是:new XMLHttpRequest(...)仅当XMLHttpRequest不存在时,您才会依赖这些过时的方法(例如,如果您需要支持IE8)或IE9-IE11处于破碎的兼容模式&#34;)。

另一个注意事项:在该代码中始终不需要使用arguments.callee,并且它不再适用于严格模式(严格模式是您想要使用的)。相反,只需使用createXHRcreateXHR.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);
    }
}