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>


...上記の 2 番目の関数は、末尾の括弧がないinnerHTMLため実行されず、関数全体になります。では、標準の Ajax 構文が同じように自己呼び出しを使用しないのはなぜでしょうか? が独自の方法で属性をXMLHttpRequest処理しているように見えます。onreadystatechange次に例を示します。

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()くださいsetTimeout()

于 2012-05-17T23:20:24.167 に答える
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 ;

Webページをクリックするまで機能は実行されません。ajax 呼び出しについても同じことが言えます。

于 2012-05-17T23:34:48.140 に答える
0

イベントリスナーを登録します。関数はすぐには実行されず、関数 (関数オブジェクト) がonreadystatechangeプロパティに割り当てられるだけです。後で呼び出されます-ajaxリクエストがその状態を変更したとき。これは、タイムアウトが不明な のようなものですsetTimeout(複数回呼び出されます)。

于 2012-05-17T23:19:53.670 に答える