7

「jQuery の学習」(第 3 版) に取り組んでいます。

第 4 章「DOM の操作」には、「Value Callback」と呼ばれるものを説明するセクションがあります。これは私にとって新しいものです。

著者は、それぞれの IDが一意でなければならないリンクのリストの例を使用して、これを説明しています。

本から:

「値コールバックは、引数の値の代わりに提供される単純な関数です。この関数は、一致したセットの要素ごとに 1 回呼び出されます。関数から返されたデータは、属性の新しい値として使用されます。たとえば、次のように、この手法を使用して、要素ごとに異なる id 値を生成できます。"

チャファー、ジョナサン (2011-09-23)。jQuery の学習、第 3 版 (p. 116)。パケット出版。キンドル版。

jQuery(document).ready(function($){

// get all external links
   $('div.chapter a').attr({
        rel:'external',
        title:'Learn more at Wikipedia',
        id: function ( index, oldValue ) {
                return 'wikilink-' + index;
        }
    });
})

魔法のように機能しますが、 id: プロパティのメカニズムは私を逃れます。

  1. パラメータ 1 (インデックス)が整数であることをどのように認識していますか?
  2. 関数はインデックスをインクリメントすることをどのように認識していますか?
  3. 2 番目のパラメーター (oldValue) は、プロパティの古い値 (変更前) を保持することをどのように認識しますか?
  4. これは jQuery コンストラクトですか? JSONのこと?かっこいいね。それは機能しますが、...この「値のコールバック」は一体何でできているのでしょうか?

お知らせ下さい

4

2 に答える 2

6

1) パラメータ 1 (インデックス) が整数であることをどのように認識していますか?

jQuery は整数を渡します。

2) 関数はインデックスをインクリメントすることをどのように認識しますか?

コールバックはインクリメントしませんindexが、jQuery メソッドはインクリメントします。

3) 2 番目のパラメーター (oldValue) は、プロパティの古い値 (変更前) を保持することをどのように認識しますか?

jQueryはそれを渡します。

質問 1 ~ 3 への回答は、次のような関数を実行することでおそらく最もよく理解できます$.attr

Array.prototype.each = function (f) {
    var i;
    for (i=0; i < this.length; ++i) {
        f(i, this[i]);
    }
};

['zero', 'one', 'two'].each(function (i,item) {console.log({i: item})});

fコールバックです。コレクションを反復処理し、各インデックスとアイテムeachを呼び出す責任があります。f関数にも同じコード構造を使用できます。

/* Map each item in a sequence to something else, 
 * returning a new sequence of the new values.
 */
Array.prototype.map = function (f) {
    var i, result = [];
    for (i=0; i < this.length; ++i) {
        result[i] = f(i, this[i]);
    }
    return result;
};

['zero', 'one', 'two'].map(function(i,item) {return item.length});
// result: [4, 3, 3]

/* Return a sequence of the items from this sequence 
 * for which 'keep' returns true.
 */
Array.prototype.filter = function (keep) {
    var i, result = [];
    for (i=0; i < this.length; ++i) {
        if (keep(i, this[i])) {
            result.push(this[i]);
        }
    }
    return result;
};

['zero', 'one', 'two'].filter(function(i,item) {return item.length <= 3});
// result: ['one', 'two']

の実装mapconcatfoldlおよびfoldr演習として残します。map別の演習として、とfilterを で書き直しeachます。

これらの関数は、コールバックがどのように機能するかを説明することのみを目的としていることに注意してください。これらは、製品コードで問題を引き起こす可能性があります。

4) これは jQuery 構造ですか? JSONのこと?かっこいいね。それは機能しますが、...この「値のコールバック」は一体何でできているのでしょうか?

コールバックは、jQuery が広範囲に使用する一般的な手法です。これらは関数型プログラミングの重要な機能であり、関数は他のデータ型と同様に操作できるデータです。したがって、関数を引数として取り、関数を返すことができる関数があります。特定のコンテキストでは、コールバックは「継続」とも呼ばれ、継続渡しスタイル( CPS ) の基礎を形成します。これは、Ajax 要求に使用されるような非同期関数呼び出し[ 2 ] (同期呼び出しとは対照的に、計算が完了する前に関数が戻る場合) で特に重要です。CPS の威力の一部を確認するには、以下をお読みください。「継続を使用して複雑な Web アプリケーションを開発する」 .

これのもう 1 つの側面である「値コールバック」の「値」は、JS は動的に型付けされた言語 (型は変数ではなくデータに関連付けられている) であるため、仮パラメーターを任意の型のオブジェクトにバインドできることです。関数は、渡された内容に応じて異なる動作をすることができます。場合によっては、引数の型を調べることでこれが実装されます。これは、事実上のアドホック ポリモーフィズムです (言語ではなく関数がディスパッチを処理する必要があります)。ただし、パラメトリック ポリモーフィズムまたは (失敗した場合)ダック タイピング引数の型を調べるよりも常に優先する必要があります。パラメトリック ポリモーフィズムは、特定の関数に渡すことができるすべての型が同じインターフェイス (メソッド名、引数、事前条件、事後条件など) をサポートすることを保証することによって実現されます。たとえば、すべてのシーケンス タイプにはlengthプロパティがあり、整数でインデックス付けする必要があります。それが成り立つ限り、配列を取る多くの関数で独自のシーケンス型を使用できます。

JSON が何を意味するのかはわかりませんが、おそらく一般的な意味ではありません。JSON は、JS オブジェクト リテラル構文の限定バージョンに基づくデータ交換形式です。JSON は、サンプル コードまたは引用されたテキストのどこにも含まれていません。

于 2012-07-03T00:15:07.447 に答える
4

これは JQuery コンストラクトです。ソースを見ると、値または関数のどちらを渡したかを知るために、JQuery がパラメーターを検査していることがわかります。関数の場合は、ご覧のとおりに処理されます。

于 2012-07-03T00:15:07.090 に答える