2013-06-11 107 views
2

這可能是一個顯而易見的問題,但我想知道是否在一次性使用變量中聲明某些內容或僅執行一次代碼(而不是使用它存儲它)之間存在效率差異。例如Javascript單用變量聲明

var rowId = 3, 
updateStuff(rowId); 

VS

updateStuff(3); 
+0

如果在將它傳遞給'updateStuff'後不打算使用該值,則不要先將其置於變量中。我看到的優點是它通過使用變量更具可讀性。它有能力被關閉捕獲,並可能永遠不會被釋放/ GC。但是,這**的效率,不應該是一個問題 – Ian

+0

如果有差異,它是微乎其微。你應該更加擔心代碼重用和可讀性,這取決於你在做什麼。如果rowID始終設置爲3,並且從不在其他地方使用,那麼使用變量沒有意義。然而,如果你計劃在未來擴展你的代碼,並且可能想要改變/重用rowID,那麼我會使用一個變量。 –

+0

我正在瀏覽遍佈各處的大型代碼庫(無意擴展這些部分),所以我只是好奇它是否值得清理。 – user1882953

回答

1

我認爲擔心在這種情況下的表現很大程度上是無關緊要的。這些微觀優化並不是真的給你帶來太多的收益。在我看來,這裏代碼的可讀性更重要,因爲最好將3確定爲rowId,而不是將其作爲幻數。

如果您真的關心優化,那麼使用類似Google Closure的東西來最小化您的代碼將會有所幫助;它有很多工具可以幫助你提高代碼的效率。

-2

編輯:

delete並不適用於非對象,所以我最初的反應是錯誤的。由於變量rowId被標記爲var,因此它將被垃圾回收清除。另一方面,如果沒有定義,它將在頁面/應用程序的持續時間內生存。

來源:http://lostechies.com/derickbailey/2012/03/19/backbone-js-and-javascript-garbage-collection/


變量ROWID將被保存在內存中,並且不會被垃圾收集器,因爲它引用被釋放。除非你像下面那樣釋放它,否則它會一直存在,直到程序生命結束。還記得需要時間來創建變量(最小,但你問)

var rowId = 3 
    updateStuff(rowId); 
    delete rowId 

有效率地記住,然後是有差異。你的第二個例子是最快的,並且不會花費任何額外的資源。

OBS。有些語言會優化代碼,並簡單地刪除序列,但我強烈懷疑JavaScript是這樣做的。

+2

您不能刪除僅變量對象屬性。 – Lloyd

+1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete –

+0

只要'updateStuff'中沒有任何內容保留對它的引用(或者在那些引用之後發佈) – Ian

0

如果你正在使用谷歌關閉進行編譯,如果你註釋了var作爲常量(如你的例子中所示),我懷疑編譯器會刪除常量並將其替換爲文字。

我的建議是選擇可讀的選項,如果您確實需要微觀優化並減少源代碼大小,請使用google閉包編譯器或縮小器 - 一種工具更適合積累足夠的微優化事情明顯更快,但我猜測大部分保存的毫秒將來自縮小的網絡時間。

並且var聲明確實需要時間,如果您將該var添加到全局名稱空間,那麼在解析名稱過程中還會再搜索一個。

0

使用編譯代碼的現代瀏覽器,生成的代碼將完全相同,除非該變量也在其他地方引用。

即使有舊的瀏覽器,如果有差異,它不會擔心。