0

自调用closure函数的奇怪语法意味着您本质上是在调用函数本身,因此将其设为self-invoking. 这里有一些代码证明了这一点:

<!DOCTYPE html>
<html>
    <head>
        <title>
            A Nameless Function that Executes Itself
        </title>
    </head>

    <body onload = "mainMethod();">

        <div id = "here"></div>

        <script type = "text/javascript">

            function mainMethod()
            {
                var here = document.getElementById("here");
                var hello = "Hello World!";

                here.innerHTML = function()
                {
                    return hello + "<br />";
                }(); // WITH method parentheses -- self-invoking

                here.innerHTML += function()
                {
                    return hello;
                }; // withOUT method parentheses
            }
        </script>
    </body>
</html>


...上面的第二个函数没有执行,因为它缺少结束括号,并且innerHTML变成了整个函数本身。那么,为什么您的标准 Ajax 语法不以同样的方式使用自调用呢?似乎这些属性以独特的方式处理XMLHttpRequestonreadystatechange这是一个例子:

function getStock()
{
    var req = new XMLHttpRequest();

    var stock = document.getElementById("stock");

    req.onreadystatechange = function()
    {
        if( (req.readyState == 4) && (req.status == 200) )
        {
            // value of stock
            var stockValue = req.responseText;

            stock.innerHTML = stockValue;
        }
    }
    req.open("GET", "randomStockValue.php?random=", true);
    req.send(null);

    setTimeout("getStock()", 1000);
}


注意没有结束括号...我问这个是因为我想进一步了解 Ajax 语法,以及它到底在做什么。

4

3 回答 3

3

readystatechange属性包含一个回调函数(或有时称为事件处理函数),将来当某些 ajax 事件发生时,浏览器的 ajax 引擎将多次调用该回调函数。

您不希望它立即执行。您希望将来发生这些特定事件时调用分配给它的函数。您不希望它自动执行。

有关在将来某个时间调用的事件侦听器或回调函数的其他示例,请参阅类似addEventListener()or的方法setTimeout()

于 2012-05-17T23:20:24.167 回答
0

它注册一个事件监听器。该函数不会立即执行,它(函数对象)只是分配给onreadystatechange属性。稍后将调用它 - 当 ajax 请求更改其状态时。这有点像 asetTimeout具有未知超时(并且会被多次调用)。

于 2012-05-17T23:19:53.670 回答
0

ajax 调用处理程序没有什么特别之处,您可以为第一个示例编写完全相同的代码,它将执行相同的等待:

      function mainMethod()
            {
                var here = document.getElementById("here");
                var hello = "Hello World!";

                here.innerHTML = function()
                {
                    return hello + "<br />";
                }(); // WITH method parentheses -- self-invoking

                here.innerHTML += function()
                {
                    return hello;
                }; // withOUT method parentheses
            }

document.body.onload = mainmethod ;

您给出了 2 个不共享相同上下文的示例,这就是为什么它们的行为确实不同。

现在试试

document.body.onclick = mainmethod ;

在您单击网页之前,您的功能不会执行。ajax 调用也是如此。

于 2012-05-17T23:34:48.140 回答