2012-06-04 77 views
3

我學習JavaScript和有點糊塗以下使用。這些問題可能比d3更具體。使用Javascript - 函數參數

http://mbostock.github.com/d3/ex/sunburst.html

var arc = d3.svg.arc() 
.startAngle(function(d) { return d.x; }) 
.endAngle(function(d) { return d.x + d.dx; }) 
.innerRadius(function(d) { return Math.sqrt(d.y); }) 
.outerRadius(function(d) { return Math.sqrt(d.y + d.dy); }); 

所以,

  1. 由startAngle,endAngle等取一個函數作爲參數。作爲一個函數而不是一個數字的論據的基本原理是什麼?
  2. 在全碼,沒有地方「d」是defined.I在看到幾乎所有的D3項目。什麼是「d」?它是如何設置的或它通過哪裏?

謝謝。

回答

4

第一個問題:

d3.svg.arc對象用於創建一個餅圖中的切片。每個切片都需要不同的起始角度和結束角度才能正確顯示。

d3.js您不會針對每個切片以兩個角度傳遞,而是提供一個函數,該函數需要一個參數d,它是該切片的相應數據元素並返回角度。這裏設置的其他參數也一樣。

另一個優點是,一個數據可以包含多個屬性,並且您可以決定哪個屬性需要關於可視化的哪個部分。

第二個問題

當使用函數作爲參數傳遞給另一個功能,它是常見的是使用給定的形式的函數表達式。在d3.js中,大多數用作參數的函數本身傳遞一個或兩個參數(大部分時間是需要轉換的部分數據)。在你的函數表達式中,你需要(或者至少應該)命名這些參數來解決它們。示例d中的大部分時間都用作保存特定數據項的參數的參數名稱。

它不需要在其他地方定義,因爲它只是一個正常的功能參數。如果你願意,你可以用以下方式重寫它:

function startAngleParam(d) { 
return d.x; 
} 

var arc = d3.svg.arc() 
.startAngle(startAngleParam) 
... 
1

d被作爲參數傳遞給匿名函數很清楚過去了。據推測這些功能可以採取號作爲參數,或者用於更復雜的操作的功能(有點像String.replace()如何利用一個替換字符串,OR的函數,通過它來運行結果陣列和返回替換值)

+0

我看到d以匿名方式傳遞。但是,來自其他編程語言背景,如果我使用d3庫,我不應該傳遞d​​(無論它是什麼類型)。因此,作爲用戶,我如何確保'startAngle'方法獲得正確的d,其中有一個字段x? – bsr

+0

@bsreekanth startAngle方法將調用您傳遞給它的函數。如果這是一個更傳統的面向對象的接口,就好像startAngle函數接收到一個帶有getAngle方法的對象,該方法接收單個參數(「d」)。您需要確保getAngle方法中的'd'參數與startAngle將調用它的任何內容匹配。 – hugomg

1

1:這是一個回調函數。當你把它作爲一個參數的函數不叫,而不是函數保持,並可在以後調用,也可以叫過,每當需要了。

2:參數d只是一個發送到回調函數的值,該函數用於生成結果。標識符名稱d僅在回調函數,每當功能用來在剛發送到函數照例的值定義。

送入回調函數的值是包含圓弧的座標的對象。當弧的座標改變時,調用回調函數來計算繪製弧所需的其他值。

1

我還不能評論,但希望增加Sirko的優秀答案。他指出:

在d3.js你不要在這兩個角度爲每個切片過去,但提供了一個功能,它有一個參數d,這是該片相應的數據元素,並返回角度。

我想補充一點,你可能還會遇到function(d, i) { ... }這種形式的回調。當看到這個時,d引用元素的數據,i引用它的索引 - 單字母縮寫按慣例使用,但您可以隨意調用參數。

在遍歷數據時,訪問這兩個項目可能會有幫助。例如,在本教程中,數據和索引都用於構建條形圖:http://mbostock.github.com/d3/tutorial/bar-1.html