0

このコードはhttp://twitter.github.com/からのものです

(function ($, undefined) {
    // more code ...

    $.getJSON("https://api.github.com/orgs/twitter/members?callback=?", function (result) {
        var members = result.data;
        $(function () {
            $("#num-members").text(members.length);
        });
    });

    // more code ...
})(jQuery);

まず、私が理解していること:

  • すべてのコードは IIFE にラップされています
  • 彼らはメンバーを取得するためにGithub APIを使用しています
  • URL には文字列「?callback=?」が含まれています。そのため、リクエストは JSONP として扱われます。

私が理解していない$(function() ...のは、リクエストが成功した場合に実行される関数内で使用している理由です。

このコードは同等ですか?

$(function() {
    $.getJSON("https://api.github.com/orgs/twitter/members?callback=?", function (result) {
        var members = result.data;
         $("#num-members").text(members.length);
    });
});

たぶん私は間違っているかもしれませんが、2番目のコードスニペットはドキュメントがロードされるのを待ってからメンバーを要求していると思います...だから並列処理はありませんか? 最初のコード スニペットでは、リクエストはドキュメントの読み込みと並行して行われます。私が間違っている場合は、私を修正してください。

4

3 に答える 3

1

$関数は、引数として関数を渡された場合 (恐ろしくオーバーロードされた関数です)、DOM の準備ができたときにその関数を呼び出します。

そこにあると、DOM が完了する前に内部のコード (DOM を変更しようとする) が実行されなくなります。

が呼び出される前に DOM がすでに完了している場合$、関数はすぐに呼び出されます。

によって送信された HTTP 要求は、ブラウザーが元のドキュメントの DOM の読み込みと解析を完了する前または後にgetJSON応答を受け取る可能性があることに注意してください。

これにより、DOM の準備が整うのを待たずにデータのリクエストを送信できると同時に、時期尚早の変更を防ぐことができます。

このコードは同等ですか?

いいえ。これは、データのリクエストを送信する前に、DOM の準備が整うのを待ちます。

于 2013-03-28T13:30:08.117 に答える
1

たぶん私は間違っているかもしれませんが、2 番目のコード スニペットはドキュメントが読み込まれるのを待ってからメンバーを要求していると思います。

あなたは間違っていません。それがまさに起こることです。最初のスニペットは、DOM の準備が整うのを待っている間に JSONP リクエストを作成/返すことができるように使用される可能性が最も高いです。彼らは利用可能な時間を最大限に活用しているだけです。

AJAX リクエストが完了するまでに DOM の準備が整う可能性がありますが、念のため、ready イベント ハンドラーでラップしても害はありません (DOM が既に準備ができている場合、jQuery はコールバックをすぐに実行します)。

于 2013-03-28T13:29:45.693 に答える
0

ご存じのとおり、このライブラリは jQuery を利用しています。さて、私たちがどれだけjQuery を愛し$ているかはわかっていますが、MooTools や Prototype など、私たちが知っていて愛しているキャラクターを再定義する別のライブラリを使用したい場合はどうすればよいでしょうか? あなたが与えた2番目の例を使用すると、コードが壊れます。これは$$ != jQuery.

しかし、Twitter のスニペットで$は、 はローカル変数であり、IIFE への引数であり、上書きされる可能性がはるかに低い jQuery オブジェクトがその引数として渡されます。したがって、この関数/ライブラリを使用したい人は誰でも、$.

要約すると、別のライブラリが関数定義を上書きして壊すのを防ぐために、名前空間がすべてです。$

于 2013-03-28T13:41:00.807 に答える