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']
の実装mapconcat
、foldl
およびfoldr
演習として残します。map
別の演習として、とfilter
を で書き直しeach
ます。
これらの関数は、コールバックがどのように機能するかを説明することのみを目的としていることに注意してください。これらは、製品コードで問題を引き起こす可能性があります。
4) これは jQuery 構造ですか? JSONのこと?かっこいいね。それは機能しますが、...この「値のコールバック」は一体何でできているのでしょうか?
コールバックは、jQuery が広範囲に使用する一般的な手法です。これらは関数型プログラミングの重要な機能であり、関数は他のデータ型と同様に操作できるデータです。したがって、関数を引数として取り、関数を返すことができる関数があります。特定のコンテキストでは、コールバックは「継続」とも呼ばれ、継続渡しスタイル( CPS ) の基礎を形成します。これは、Ajax 要求に使用されるような非同期関数呼び出し[ 2 ] (同期呼び出しとは対照的に、計算が完了する前に関数が戻る場合) で特に重要です。CPS の威力の一部を確認するには、以下をお読みください。「継続を使用して複雑な Web アプリケーションを開発する」 .
これのもう 1 つの側面である「値コールバック」の「値」は、JS は動的に型付けされた言語 (型は変数ではなくデータに関連付けられている) であるため、仮パラメーターを任意の型のオブジェクトにバインドできることです。関数は、渡された内容に応じて異なる動作をすることができます。場合によっては、引数の型を調べることでこれが実装されます。これは、事実上のアドホック ポリモーフィズムです (言語ではなく関数がディスパッチを処理する必要があります)。ただし、パラメトリック ポリモーフィズムまたは (失敗した場合)ダック タイピング引数の型を調べるよりも常に優先する必要があります。パラメトリック ポリモーフィズムは、特定の関数に渡すことができるすべての型が同じインターフェイス (メソッド名、引数、事前条件、事後条件など) をサポートすることを保証することによって実現されます。たとえば、すべてのシーケンス タイプにはlength
プロパティがあり、整数でインデックス付けする必要があります。それが成り立つ限り、配列を取る多くの関数で独自のシーケンス型を使用できます。
JSON が何を意味するのかはわかりませんが、おそらく一般的な意味ではありません。JSON は、JS オブジェクト リテラル構文の限定バージョンに基づくデータ交換形式です。JSON は、サンプル コードまたは引用されたテキストのどこにも含まれていません。