我正在阅读一本关于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构造函数语法没有足够的掌握,这就是我在这里绊倒的。
答案 0 :(得分:1)
立即返回并退出代码块。只有其中一个回报会被击中。
答案 1 :(得分:1)
您提到的try块仅在if条件
时执行if(typeof XMLHTTPRequest == "undefined")
保持良好。如果没有,它会直接到达getHTTPObject()
方法末尾的return语句,然后返回新的XMLHTTPRequest
对象。
因此,返回新的ActiveXObject
或新的XMLHTTPRequest
。
答案 2 :(得分:1)
在外部构造函数之前不调用内部构造函数。 相反,XMLHTTPRequest函数首先定义,如果它不存在,然后作为构造函数调用。
它首先检查XMLHTTPRequest是否存在(原始的或者前一次调用中的一个。如果存在,则将其称为构造函数。如果不存在,则首先创建它。
这里的一个技巧是,如果构造函数返回一个对象,new
对象不是已分配的对象,而是返回的对象。通常,这会导致立即进行垃圾回收。聪明的翻译可能意识到它根本不需要分配。这是新创建的构造函数所做的 - 返回一个不同的对象。
(见http://www.gibdon.com/2008/08/javascript-constructor-return-value.html)
创建的XMLHTTPRequest取代了浏览器的XMLHTTPRequest。浏览器自己的XMLHTTPRequest构造函数不能作为函数调用,需要作为构造函数调用,这就是为什么新创建的对象也必须作为构造函数调用。
请注意,这通常是库或工具包(例如jQuery)的工作,以选择正确的AJAX对象。
答案 3 :(得分: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
实例。
答案 4 :(得分: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 Language Specification中的此行为的干版本。