2014-01-06 40 views
1

如果我想要一個函數在第一次運行時做一些不同的事情,我可以檢查它每次運行以確定它是否是第一次,或者我可以更改函數;像這樣:是一種自修改功能嗎?

foo=function(a,b){ 
    ...do something1... 
    foo=_foo; 
} 
_foo=function(a,b){ 
    ...do something2... 
} 

這是不好的;如果是這樣,爲什麼?有一個更好的方法嗎?我特別期待在JavaScript中實現這一點,但其他語言點將被考慮。

+1

這實際上取決於您要如何修改該功能。通常,這用於緩存,所以這只是該功能的用戶不應該注意的性能增強。如果是這樣的話,那很好。如果沒有,您可能需要詳細說明您的具體情況。 – kba

+0

我通常使用一個靜態變量(屬性)作爲標誌來處理「首次運行」場景 –

+1

幾乎總是很糟糕。回到當天,我們會爲資源受限系統編寫自修改代碼,其中您的瀏覽器不是其中一個。即使是記憶也不是一個很好的藉口,國際海事組織,但這不是一個技術性的辯論。 –

回答

1

這不是一個嚴格意義上的「自我修改」功能 - 您不會隨時修改任何代碼(並且會很糟糕),只需爲函數名稱指定另一個值即可。這在大多數情況下都很好,並且使得多態代碼非常簡單和優雅。爲了使意圖更清潔,可以將「第一次」代碼分解爲單獨的功能:

function firstTimeFoo() { 
    ..... 
    foo = normalFoo 
} 

function normalFoo() { 
    ... 
} 

foo = firstTimeFoo