2

我正在(重新)从https://developer.mozilla.org/en/AJAX/Getting_Started上的 Mozilla 站点学习 Ajax ,我面临着这段代码:

(function () {
    var httpRequest;
    document.getElementById("ajaxButton").onclick = function () {
        makeRequest('test.html');
    };

    function makeRequest(url) {
        if (window.XMLHttpRequest) { // Mozilla, Safari, ...
            httpRequest = new XMLHttpRequest();
        } else if (window.ActiveXObject) { // IE
            try {
                httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!httpRequest) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            return false;
        }
        httpRequest.onreadystatechange = alertContents;
        httpRequest.open('GET', url);
        httpRequest.send();
    }

    function alertContents() {
        if (httpRequest.readyState === 4) {
            if (httpRequest.status === 200) {
                alert(httpRequest.responseText);
            } else {
                alert('There was a problem with the request.');
            }
        }
    }
} //missing closing bracket added by bwalton 5/11/11.   )();

虽然我设法理解了代码并让它工作,但直到我剥离了顶部的“(function(){”部分和这段代码段末尾的所有结束括号。问题是我没有了解“(函数{”的目的,而FF似乎也没有。(在我剥离“(函数{”部分之前,它不会将此段识别为Javascript。有人知道这段代码的目的吗?)我知道我也在某个地方看到过它,这次我想知道它的确切含义。

在此先感谢您的帮助。

4

4 回答 4

7

这:

(function() {
    ...
})();

创建一个函数并立即使用它自己的作用域调用它。一个常见的术语是 IIFE——“立即调用的函数表达式”。

在这种情况下,您无意中合并了最后两行,因此提到的单行注释bwalton通过删除尾随) ();.

没有尾随() 你有一个函数引用,但它没有被调用。

修复代码副本所需要做的就是在bwalton 5/11/11..

于 2012-04-12T09:20:28.917 回答
2

(function() { /* code here */ })();创建一个匿名函数并就地执行它。目的之一是创建本地范围。

于 2012-04-12T09:20:51.067 回答
0

你看到了吗 ()();

这是附加到某个值的调用括号。现在。

(function(){});

是一个函数,括号下封闭的匿名函数。全部加起来。

(function(){}) ();

对括号中的函数的调用。惊人的!!

于 2012-04-12T09:22:10.427 回答
0

如上所述,这是一个闭包,有关闭包的更多信息,请参阅链接http://jibbering.com/faq/notes/closures/

于 2012-04-12T09:28:35.763 回答