このJavaScriptコードがどのように機能するかを理解するのに苦労しています。私はJSを学んでおり、以前は動的で関数型の言語に触れていませんでした。そこで、関数呼び出しをビット手続き型の階層順に視覚化します。d3.jsを使用すると、ここで説明するようにsvg要素を描画できます。
var dataset = [ 5, 10, 15, 20, 25 ];
d3.select("body").selectAll("p")
.data(dataset)
.enter()
.append("p")
.text("New paragraph!");
最後の行を変更しましょう:
.text(function(d) { return d; });
このデモページで新しいコードの機能を確認してください。
うわあ!data()メソッドの魔法のおかげで、データを使用して各段落のコンテンツを入力しました。メソッドをチェーン化すると、data()を呼び出した後はいつでも、dを入力として受け入れる無名関数を作成できます。魔法のdata()メソッドは、現在の要素が手元にある場合、dが元のデータセットの対応する値に設定されることを保証します。
上記のこの魔法は、私が理解できないことです。「d」はグローバル変数ではありません。別の(c)名に変更した場合でも、機能します。したがって、data
メソッドは匿名fnの値を設定している可能性があります。
ただし、現在の関数がオブジェクトを返し、そのオブジェクトで次のメソッドを呼び出すことができるため、通常は(私の限られた読み取りで)連鎖が可能です。上記の場合、data
メソッドはテキスト(「新しい段落!」)がユーザーによって渡されたかどうかをどのように認識しますか。そうでない場合は、データを匿名のfnに渡します。疑問は、text
メソッドがダウンラインにあり、data()
すでに実行されていることです。データはどのように無名関数に渡されますか?
ありがとう。