1

d3.layout.force のソース コードの 158 行目に、次のコードがあります。

force.charge = function(x) {
    if (!arguments.length) return charge;
    charge = typeof x === "function" ? x : +x;
    return force;
};

225 行目に移動すると、次のように表示されます。

charges = [];
if (typeof charge === "function") {
  for (i = 0; i < n; ++i) {
    charges[i] = +charge.call(this, nodes[i], i);
  }
} else {
  for (i = 0; i < n; ++i) {
    charges[i] = charge;
  }
}

ここでわからなかったのは次の行です

charges[i] = +charge.call(this, nodes[i], i);

私は JavaScript が初めてで、ここで何が起こっているのか理解できません。

私が理解している限り、料金は引数を1つしか取りません( x)。ここで " this" は現在のオブジェクトのコンテキストを与えるために渡されますが、他の 2 つについてはどうでしょうか? nodes[i]「 」と「 」iのどちらを「 」としxますか?

また、「= +」はここで何をしているのですか?

4

3 に答える 3

1

callapply、およびbindの MDN リストを確認してください。

理解するのは難しい概念ですが、call と apply で起こっていることは、別の "コンテキスト" で関数を実行することを選択しているということです。

「実行コンテキスト」はJSで正確な意味を持っているため、引用符付きの「コンテキスト」と言いますが、そうではありません。私はそれについて素晴らしい言葉を持っていませんが、ここで起こっていることはthis、関数を実行するときにオブジェクトを交換していることです。

これは役立つかもしれません:

var obj = { foo: "bar" };
method.call( obj, "arg" );
function method( arg ) {
    console.log( this.foo ); #bar
    console.log( arg ); #"arg"
}
于 2012-05-31T22:52:49.970 に答える
1

ここで答えが見つかると思います。

基本的には、これを変換しています:

function(){ return +new Date; }

これに:

function(){ return Number(new Date); }

基本的に、引数を数値に変換し、それを前の値に追加します。

これについての詳細はこちら

于 2012-05-31T22:53:11.680 に答える
0

chargeもっと慎重にフォローする必要があります。11 行目で定義されている変数です。

charge = -30,

force.chargeあなたが引用した機能は料金を設定するためのものであり、 で言及されている機能ではありませ+charge.call(this, nodes[i], i);。の 2 行目を見てくださいforce.charge:

charge = typeof x === "function" ? x : +x;

x料金を動的に計算するために渡す関数 (コールバック) にすることができます現在のノード ( nodes[i]) とノードのインデックス ( i) がこのコールバックに渡されるため、これらの値に基づいて料金を動的に計算できます。

force.charge(function(node, index) {
    return index * 2;
});

x(したがってcharge) は、数値または数値文字列にすることもできます。chargeそのため、 が関数であるかどうかを事前にテストします。

if (typeof charge === "function") {
  // function so we call it and pass the current node and index
} else {
  // static value, the same for each node
}

それとは別に、関数が定義したパラメーターの数に関係なく、いつでも任意の数の引数を関数に渡すことができます。例えば:

function foo() {
    alert([].join.call(null, arguments));
}

foo('a', 'b');

警告しa,bます。


質問に答えるには: .call() [MDN]または.apply() [MDN]に渡される引数は、同じ順序で関数に渡されます。したがって、関数がある場合は、function foo(a, b, c)asおよびas ( would be )foo.call(null, x, y)を渡します。xaybcundefined

+演算子は単項プラス演算子[MDN]で、オペランドを単純に数値に変換します。

于 2012-05-31T22:56:49.733 に答える