2012-07-03 5 views
7

私は "Learning jQuery"(第3版)を通して作業しています。第4章でjQuery:「バリューコールバック」とは何ですか?

:「バリューコールバック」と呼ばれるものを説明するセクションがあり、「DOMの操作」。これは私のための新しいものです。

著者は、各のIDがユニークでなければならないリンクのリストの例を介してこれを説明します

帳から:。

「値のコールバックは、単に代わりに引数の値を供給されている機能です。この機能は、マッチしたセット内の要素ごとに一度呼び出されたデータが返されるものは何でも。たとえば、このテクニックを使用して、次のように各要素の異なるid値を生成することができます: "

Chaffer、Jonathan(2011-09-23)。 Learning jQuery、第3版(116ページ) Packt Publishing。キンドル版。

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のこと?かっこいいね。それは働いていますが...何て言われていますかですこの「価値コールバック」もので作られていますか?

答えて

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を呼び出します。同じコード構造が機能のために使用することができる。mapconcat

/* 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'] 

実装foldl and foldr運動として残し。もう1つの練習として、eachmapfilterを書き換えてください。

これらの関数は、コールバックの仕組みを示すためのものです。プロダクションコードに問題が生じることがあります。

4)これはjQuery構造ですか? JSONのこと?かっこいいね。それは動作しますが、...これは "価値コールバック"のものは何ですか?

Callbacksは、jQueryが広範に使用する一般的な技術です。それらはfunctional programmingの重要な機能です。機能は他のデータタイプと同様に操作できるデータです。したがって、関数を引数として取り、関数を返す関数があります。特定の状況では、callbacksは「継続」としても知られており、continuation passing styleCPS)の基礎を形成しています。これは、asynchronous function calls [2](計算が完了する前に、synchronous callsではなく関数が返る場所)(Ajax要求などに使用される)の場合に特に重要です。 CPSの力の一部を見るには、"Use continuations to develop complex Web applications"と読んでください。

"value callback"の "value"は、JSが動的型付き言語(型は変数ではなくデータに関連付けられている)であるため、仮パラメータをいかなるタイプ。関数は、何が渡されるかによって異なる動作をすることができます。場合によっては、これは実際にはad-hoc polymorphism(言語ではなく関数がディスパッチを処理しなければならない)の引数の型を調べることによって実装されます。しかし、parametric polymorphismまたは(失敗した)duck typingは、引数型の検査よりも常に優先されるべきです。パラメトリック多態性は、特定の関数に渡すことができるすべての型が同じインタフェース(メソッド名、引数、前提条件、事後条件&など)をサポートすることによって実現されます。たとえば、すべてのシーケンスタイプはlengthプロパティを持ち、整数でインデックスを付ける必要があります。それが保持している限り、配列を取る多くの関数で独自の配列型を使用することができます。

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

+0

大きな故障。ありがとう! – sleeper

+0

さらに詳しい故障!わかった。だから、このパターンはカリングの例ではありませんか? – sleeper

+0

カレーに関するこの議論はまだまだ新しい2私です、それは私の頭の上です。しかし、あなたの内訳は完全に答えて、私の質問で提起された問題を説明します。だから私は自分の答えをあなたのものに切り替えました。あなたがこの答えに入れたすべての仕事に感謝します! – sleeper

4

これはJQuery構造です。ソースを見ると、JQueryが値または関数を渡したかどうかを調べるためにパラメータを調べていることがわかります。それが関数なら、あなたが見るように処理します。

+0

Wow。とてもかっこいい。このトピックについてさらに読むことをお勧めしますか? – sleeper

+0

実際、 '$ .attr'はカリングを利用しません。 curryingは、* n * -ary関数(* n *引数をとる関数)を* n *単項関数に変換することです。各関数は単項関数を返します。 – outis

関連する問題