0

我正在阅读一本关于 DOM 脚本的书,当他们谈论 Ajax 时,书中出现了以下函数。

function getHTTPObject() {

    if(typeof XMLHTTPRequest == "undefined")
        XMLHTTPRequest = function() {
           try { return new ActiveXObject("Msxml2.XMLHTTP.6.0");}
           catch(e) {}

           //several more fall through try/catch blocks attempting 
           //to create different XMLHTTP objects. 
           //If none succeed...

           return false;
        }

     return new XMLHTTPRequest();
}

如果尝试在分配给 XMLHTTPRequest 的内部匿名函数中创建 ActiveXObject 时在 try/catch 块中使用了 new 关键字,为什么在 getHTTPObject() 的末尾返回 XMLHTTPRequest 的结果时再次使用 new 关键字?

似乎它正在返回一个新的新对象。

编辑

我大致了解代码的目的是什么,检查 XMLHTTPRequest 构造函数是否存在,如果不存在,则定义一个尝试生成 XMLHTTP ActiveXObjects 的构造函数。到目前为止,我和你在一起。

假设 XMLHTTPRequest 未定义。

XMLHTTPRequest 被分配了内部函数构造函数。

然后在 getHTTPRequest 的底部调用 XMLHTTPRequest。

在 XMLHTTPRequest 中,创建一个新的 ActiveXObject 并将其返回给调用者,在本例中为 getHTTPObject。现在 getHTTPObject 又将这个对象返回给它的调用者。但同样,为什么这条线:

return new XMLHTTPRequest() 

如果新的(即对象实例化)已经出现在 XMLHTTPRequest() 的定义/范围内的那个 try 块的代码中,是否需要那个新的?为什么不简单:

return XMLHTTPRequest()

谢谢大家的回答。很有可能,甚至可能是我对 JS 构造函数语法的掌握不够强,这就是让我在这里绊倒的原因。

4

5 回答 5

1

返回立即发生并退出代码块。这些回报中只有一个会受到打击。

于 2012-10-12T03:29:11.507 回答
1

你误解了代码。

> function getHTTPObject() {
> 
>     if(typeof XMLHTTPRequest == "undefined")
>         XMLHTTPRequest = function() {

如果标识符XMLHTTPRequest未定义,则分配以下函数。

>            try { return new ActiveXObject("Msxml2.XMLHTTP.6.0");}
>            catch(e) {}
> 
>            //several more fall through try/catch blocks attempting 
>            //to create different XMLHTTP objects. 
>            //If none succeed...
> 
>            return false;
>         }

现在调用 XMLHttpRequest,它将是主机提供的函数或上面分配的函数。

>      return new XMLHTTPRequest(); }

以上假设如果标识符 XMLHttpRequest 解析为 undefined 以外的其他内容,则它是可调用的并返回一个XMLHttpRequest实例。

于 2012-10-12T03:42:29.687 回答
1

您提到的 try 块仅在 if 条件下执行

if(typeof XMLHTTPRequest == "undefined")

成立的很好。如果不是,它直接到达方法末尾的return语句,getHTTPObject()然后返回新XMLHTTPRequest对象。

因此,返回新的ActiveXObject或新XMLHTTPRequest的。

于 2012-10-12T03:39:41.713 回答
0

内部构造函数不会在外部构造函数之前调用。相反,如果 XMLHTTPRequest 函数不存在,则首先定义它,然后将其作为构造函数调用。

它首先检查 XMLHTTPRequest 是否存在(无论是原生的,还是来自先前调用的。如果存在,则将其作为构造函数调用。如果不存在,则首先创建它。

这里的一个技巧是,如果构造函数返回一个对象,则该new对象不是被分配的对象,而是被返回的对象。通常,这会导致立即进行垃圾收集。一个聪明的解释器可能会意识到它根本不需要分配。这就是新创建的构造函数所做的 - 返回一个不同的对象。(见http://www.gibdon.com/2008/08/javascript-constructor-return-value.html

创建的 XMLHTTPRequest 替换了浏览器的。浏览器自带的 XMLHTTPRequest 构造函数不能作为函数调用,需要作为构造函数调用,这也是为什么新创建的对象也必须作为构造函数调用的原因。


请注意,这通常由库或工具包(例如jQuery)来选择正确的 AJAX 对象。

于 2012-10-12T03:42:18.233 回答
0

JavaScript 允许从其构造函数返回另一个对象;构造函数在这里定义:

XMLHTTPRequest = function() {
       try { return new ActiveXObject("Msxml2.XMLHTTP.6.0");}

在成功的情况下,生成的对象将返回给作为构造函数调用的new ActiveXObject("Msxml2.XMLHTTP.6.0")任何调用者。XMLHTTPRequest

    return false;

该语句将只返回一个空类型的对象,XMLHTTPRequest因为false它本身不是对象。

最后getHTTPObject()需要返回一个对象,而不仅仅是构造函数,这就是你看到return new XMLHTTPRequest();最后的原因。

另请参阅ECMAScript 语言规范中此行为的干版。

于 2012-10-12T03:47:58.517 回答