此代碼:
var force = d3.layout.force()
.nodes(nodes)
.links([])
.size([w, h])
.start();
應在基本相同的閱讀,你會讀它,如果它是C++(除var
關鍵字;在C++中,你不得不聲明一個特殊類型force
) 。像C++一樣,空白(大部分)是微不足道的。每個.
表示一個屬性訪問。 (與C++不同,JavaScript對象不區分字段和方法;一切都屬於屬性,如果它是一個函數屬性,那麼可以通過在帶括號的圓括號—後面加上括號中的函數參數來調用它)。在這裏:
d3.layout
- 訪問d3
的layout
財產。
.force()
- 調用屬於d3.layout
的屬性force
。在force
內部,d3.layout
將可用作關鍵字this
。
.nodes(nodes)
- 調用nodes
功能是什麼對象是由調用返回的force()
的屬性(也許d3.layout
,也許是別的東西)。
- 等
最後分配給force
由start()
返回的值。
關於第二個代碼段:
force.on("tick", function(e) {
// Push different nodes in different directions for clustering.
var k = 6 * e.alpha;
nodes.forEach(function(o, i) {
o.y += i & 1 ? k : -k;
o.x += i & 2 ? k : -k;
});
在這裏,我們看到一個的例子(2,實際上)。基於通常的JavaScript約定,force
的on
函數可能用於在此情況下爲"tick"
事件註冊事件處理程序—。事件處理程序是匿名函數:
function(e) {
// Push different nodes in different directions for clustering.
var k = 6 * e.alpha;
nodes.forEach(function(o, i) {
o.y += i & 1 ? k : -k;
o.x += i & 2 ? k : -k;
}
爲了便於說明,我們將此函數稱爲「outer」。它需要一個參數,我猜想它是一個包含tick事件屬性的對象。在外部體中,我們看到另一個匿名函數:參數爲nodes.forEach
。我們稱之爲第二個匿名函數「inner」。這裏的forEach
函數很可能是標準的forEach
迭代器函數,它是所有JavaScript數組的屬性;它將一個函數作爲參數,並按順序調用數組中每個元素的函數,傳遞數組元素和元素索引。 Inner實際上是一個關閉的示例:函數主體引用變量k
,它被定義爲外部的局部變量。
JavaScript在某些方面就像C++一樣,在某些方面有着根本性的不同。除非你知道相似之處的結束和差異的開始,否則你的C++背景會導致你在編碼(和代碼閱讀)方面陷入嚴重的誤區。我強烈推薦介紹性論文"A re-introduction to JavaScript"。它涵蓋了該語言的所有主要功能,並且應該有助於澄清C++和JavaScript如何相似以及它們有何不同。
爲什麼猜測?爲什麼不花時間通過閱讀這些知識來學習語言? https://developer.mozilla.org/en-US/learn/javascript – 2013-02-21 07:40:34
如果您是JavaScript新手,我認爲讀取d3代碼並不是學習它的最佳方式,因爲這個庫有一些特殊性,甚至很難了解更多有經驗的javascripters。雖然沒有特別談論這個代碼。 – 2013-02-21 07:49:16