2012-05-31 36 views
1

在d3.layout.force的源代碼,管線158,有這種代碼理解d3.js源:停留在function.call()和 「= +」

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; 
    } 
} 

什麼我不明白這裏是我新的JavaScript和無法理解WHA行

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

這裏正在進行。

據我瞭解,電荷只需要1個參數(x)。這裏傳遞「this」以給出當前對象的上下文,但其他兩個呢? 「nodes[i]」和「i」中的哪一個被視爲「x」?

什麼是「= +」在這裏做?

+0

還有一個「充電」功能的地方,我想。回答 – Pointy

回答

0

更多閱讀你必須遵循charge更仔細。它在line 11定義的變量:

charge = -30, 

您報價爲設置充電功能force.charge,它是+charge.call(this, nodes[i], i);提到的功能。看一看的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)那麼foo.call(null, x, y)將通過x作爲ay作爲bcundefined)。

+運算符是unary plus operator [MDN],這隻需將操作數轉換成一個數字。

+0

感謝解釋:),即「充電」真的搞糊塗了。 –

1

查看關於callapplybind的MDN列表。

這是一個困難的概念,但是在調用和應用中發生的事情是,您選擇在不同的「上下文」中執行一個函數。

我說引用的「上下文」作爲「執行上下文」在JS中有一個確切的含義,這不是它。我沒有一個好的詞彙,但是這裏發生的是,當你執行這個函數時,你正在交換出this這個對象。

這可能幫助:

var obj = { foo: "bar" }; 
method.call(obj, "arg"); 
function method(arg) { 
    console.log(this.foo); #bar 
    console.log(arg); #"arg" 
} 
+0

以及感謝,但正如我所說,我undertand「這」是通過電流對象的上下文給出。我有一點想法如何調用,應用和結合的作品,但我不明白的另外兩個參數(如功能費只有一個參數)在那裏做什麼? –

+0

@Sarvesh:看到我的答案。 –

1

我想你會發現你的答案here。從本質上講

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

,它被轉換參數轉換爲一個數字,並且將其添加到先前的值:

基本上,它是將這樣的:

function(){ return +new Date; } 

到這一點。這個here

+0

喔......這是簡單.....感謝 –

+0

很高興我能幫助!如果回答您的問題,請確保接受答案。 :) – Codeman