为什么我们将null传递给XMLHttpRequest.send?

Wal*_*han 26 javascript ajax

为什么send经常被称为

xhr.send(null)
Run Code Online (Sandbox Code Playgroud)

代替

xhr.send()
Run Code Online (Sandbox Code Playgroud)

W3,MDNMSDN都声明它是可选的.此外,ActiveX控件似乎不需要参数:

hr=pIXMLHTTPRequest.CreateInstance("Msxml2.XMLHTTP.6.0");
SUCCEEDED(hr) ? 0 : throw hr;

hr=pIXMLHTTPRequest->open("GET", "http://localhost/books.xml ", false);
SUCCEEDED(hr) ? 0 : throw hr;

hr=pIXMLHTTPRequest->send(); // <-- this line
SUCCEEDED(hr) ? 0 : throw hr;
Run Code Online (Sandbox Code Playgroud)

这种做法send(null)至少可以追溯到2005年的Google地图,但是在缩小范围之后,没有任何解释:

Y.asynchronousTransform = function (qc, vb, kc, Nc, Ba) {
    if (m.type == 3) return;
    var cc = Y.getCached(kc);
    if (cc) {
        cc.transformToHTML(qc, vb);
        if (Nc) Nc();
        return
    }
    var yc = qa.create(Ba);
    var sa = Xd.create();
    nd('<a href="' + kc.xmlEscape() + '">' + kc.xmlEscape() + "</a>", 0);
    sa.open("GET", kc, true);
    sa.onreadystatechange = function () {
        if (sa.readyState == 4) {
            if (yc.isValid()) {
                try {
                    var Db = sa.responseXML;
                    var cc = Y.create(Db);
                    Y.cache(kc, cc);
                    cc.transformToHTML(qc, vb);
                    if (Nc) Nc()
                } catch (b) {}
            }
        }
    };
    sa.send(null)
}
Run Code Online (Sandbox Code Playgroud)

bfu*_*oco 14

如果你会在XMLHttpRequest的一个旧规范看一看,好像仿佛W3C并没有要求该参数是可选的,在一个点上,这可能导致人们提供一个明确的空值"以防万一".

(搜索'应该支持发送') http://web.archive.org/web/20060409155734/http://www.w3.org/TR/XMLHttpRequest/

我遇到的另一个可能的原因来自俄语页面的翻译,可在此查看:长谷歌翻译链接(搜索'GET-Version for Version without ActiveX')

当您发送没有ActiveX的版本的GET请求时,您必须指定null,否则您不能指定任何参数.如果GET始终指定为null,则不会失败:

我不知道这是否属实,但似乎有理由认为,如果GET参数包含在正文中,那么如果数据值是"未定义",则可能尚未生成正文.

不幸的是,我无法在搜索中找到任何更具说服力的内容.


Ker*_*mes 7

不添加null会在旧版本的Firefox中引发异常.

这种行为早在2002年就已存在,并且已经存在于Firefox 3(2008)中.