2014-09-05 77 views
0

這是JS中的單位轉換器。當有人轉換音量時,輸入音量首先轉換爲升,然後轉換爲其他任何單位。計算值自動顯示在輸入欄中。爲此目的,我創建了一個對象來存儲轉換值,就像這樣:在對象中使用數學運算

var volumes={ 
    cbm: 1000, 
    ltr: 1, 
    ml: 0.001, 
    barrel: 158.9873, 
    gal: 3.785411784, 
    pint: 0.473176473, 
    floz: 0.0295735295625, 
    //and so on 
}; 

而對於一個系統的單位之間的轉換,我想這一點:

var volumes={ 
    impfloz: 0.0284130642624675, 
    imppint: this.impfloz*20, 
    impbarrel: this.impfloz*5600, 
    impgal: this.impfloz*160 
}; 

但它沒有工作。當我輸入一個值時,例如在輸入字段「Imperial-Barrel」中,所有其他輸入字段顯示:NaN。我真的必須爲每個函數編寫函數嗎?這會使代碼更復雜,更難以閱讀。有沒有辦法讓對象成員自動應用所需的數學運算?

+0

請參閱[對象字面聲明中的自引用](http://stackoverflow.com/a/4616273/218196) – 2014-09-05 17:42:56

回答

1

不,你不能這樣做。但是如果你擔心污染與impfloz變量全局命名空間中有什麼錯

var impfloz = 0.0284; 
var volumes={ 
    impfloz: impfloz, 
    imppint: impfloz*20, 
    impbarrel: impfloz*5600, 
    impgal: impfloz*160 
}; 

,你可以包住整個事情在IIFE。

this僅在一個函數中有意義,它指的是函數被調用的對象。

+0

感謝您的信息。它的作品,但我認爲它不是很優雅...但你能解釋我爲什麼,當我在桶字段中輸入1000億,加侖字段顯示34999999999999.99.99而不是35000000000000?我的意思是這就是我試圖這樣做的原因。 JS會自動切斷一些小數,如果是的話,有什麼辦法來防止這種情況? – quaductas 2014-09-05 18:00:24

+0

@quaductas JS數字是「雙精度浮點數」,它們的上限約爲2^53,如果你需要更高的值,你必須使用一個庫。 – 2014-09-05 19:56:37