2015-02-06 35 views
3

我試圖搜索這個JavaScript函數的解釋。我想了解這個函數如何獲得價值?有人可以建議一個地方,我可以閱讀更多關於傳遞/使用價值的方式。瞭解JavaScript

pie.value = function(_) { 
    if (!arguments.length) return value; 
    value = _; 
    return pie; 
}; 

此代碼來自D3 JS。

+1

這是不可能的說,因爲'價值'沒有在你發佈的代碼中聲明。該函數內部的符號'value' * *不與* pie對象的屬性名稱相同。 – Pointy 2015-02-06 02:57:22

+0

你的意思是[http://underscorejs.org/](http://underscorejs.org/)? – amitthk 2015-02-06 02:59:09

+0

「這樣」是什麼意思?它只是以正常的方式傳遞一個參數。參數的名稱是'_'。 – Barmar 2015-02-06 03:11:26

回答

6

這是一個依靠關閉的吸氣/吸氣器。

var value = 5; // initial value 

var getterSetter = function(newValue) { 
    // value is closed from the outer scope 
    if (!arguments.length) { 
    // CASE A 
    return value; 
    } 
    // // CASE B 
    value = newValue; 
    return getterSetter; 
}; 

getterSetter() // arguments.length is 0 (CASE A) so displays value (5) 

getterSetter(10) // arguments.length is 1 (CASE B) so values is set to 10 

getterSetter() // now this displays 10 since value now is 10 (CASE A) 

console.log(value); // Also displays 10, this is the same value variable 

現在在CASE B中,您可以看到getterSetter返回自身。這樣,就變成(種)可鏈接,這意味着你可以這樣做:

getterSetter(1)(2)(3)(); // assign 1 then 2 then 3 and displays 3; 

你的情況是因爲pie對象在實例B返回有點差別,而不是功能pie.value,這意味着你可以做到這一點:

pie.value(1).value(2).value(3).value(); 
+0

好吧現在我明白了,我沒有看到頂部的變量。 – 2015-02-06 06:17:01