[英]javascript var statement and performance
選項1:沒有賦值的多個var
function MyFunction() {
var a = null;
var b = null;
....
var z = null;
a = SomeValue;
b = SomeValue2;
....
}
選項2:一個var語句,沒有賦值
function MyFunction() {
var a, b ..., z;
a = SomeValue;
b = SomeValue2;
....
}
選項3:帶賦值的多個var語句
function MyFunction() {
var a = SomeValue;
var b = SomeValue2;
....
var z = SomeValue26;
}
使用特定選項有任何性能優勢嗎? 原始類型賦值AND
對象引用賦值都是如此嗎?
感謝您的輸入。
要了解性能,首先應了解吊裝 。 我們來看下面的代碼:
var x = 1;
function bar(val) {
var returnVal = val * 2;
return returnVal;
}
function foo(val) {
var returnVal = 10;
returnVal *= bar(val);
return returnVal;
}
var y = foo(x);
console.log(y); // 20
吊裝基本上意味着JavaScript解釋器會將變量聲明“提升”到其范圍的頂部。 使這個例子看起來更像這樣:
var x, y;
x = 1;
function bar(val) {
var returnVal;
returnVal = val * 2;
return returnVal;
}
function foo(val) {
var returnVal;
returnVal = 10;
returnVal *= bar(val);
return returnVal;
}
y = foo(x);
console.log(y); // 20
因此,在您給出的示例中,選項2和3基本上會做同樣的事情。 由於解釋器會將這些聲明移到頂部。 在那時,這是一個偏好的決定。 很多人都避免做像var x, y, z;
這樣的事情var x, y, z;
說這很危險。 我個人而言,這樣做。 在我所處的任何范圍內,我將在頂部聲明所有變量,然后在下面使用它們。 但無論哪種方式都有效
現在,您的第一個例子效率最低。 吊裝后它看起來像這樣:
function MyFunction() {
var a, b, ... z;
a = null;
b = null;
...
z = null;
a = someValue;
b = someValue2;
...
z = someValueN;
}
它基本上導致設置變量兩次。
在Chrome中, 執行時間相同 。
這里唯一真正的考慮因素是優化網絡傳輸 。
考慮var a=1;var b=2;...;var z=9;
與var a=1,b=2,...,z=9;
如果你在每個標識符前放置一個;var
,那就是5個字節(假設是單字節字符編碼),而a ,
則為1個字節。 因此,聲明26個變量,您可以通過編寫var
一次並使用逗號列出標識符來節省100個字節。
雖然這不是一個巨大的節省,但每個字節都有助於推動網絡上的比特。 這不是什么值得擔心的問題,但是如果你發現自己在同一區域中聲明了幾個變量,那么使用變量聲明列表可以輕松地從JS文件中刪除幾個字節。
這似乎是過早的優化,是萬惡之源。
它會執行多少次? 整個程序的哪一部分會消耗掉?
我會用幾個問題反駁你關於表現的問題:
我將假設所有這些的答案都是否定的 。
沒有任何選項可以產生任何顯着差異,盡管唯一可以確定的方法是運行它們並進行測試。 JavaScript作為一個異步客戶端語言意味着,你必須運行的代碼認真大量有var
語句是任何形式的瓶頸。
最后,如果您決定使用哪個版本,我建議使用單個var
語句而不分配:
function () {
var a,
b,
c,
foo,
bar,
fizz,
buzz;
a = 1;
...
b = 3;
}
其原因在於,這主要是由於可變提升而導致代碼執行的方式。 然后我可以移動initialize語句,以便首次使用變量,例如在for
循環中:
function foo(arr) {
var i,
l;
...
for (i = 0, l = arr.length; i < l; i++) {
doStuff(arr[i]);
}
...
}
它們基本上都做同樣的事情:聲明一個變量並最終定義它(為它分配一些東西)。 在整個示例中,您唯一要改變的是發生的順序,甚至這取決於編譯JavaScript的瀏覽器 - 有些可能會執行其他人沒有的優化。
你應該遵循一些風格指導, 這個答案很好地解釋了它們。 請記住,該答案與技術無關,可能根本不適用於JavaScript。
如果可能的話,只要遠離選項1,就不需要進行兩項任務。
即使在for循環或其他復合語句/塊中聲明的變量也可以在其包含塊之外使用。
你也可以這樣做:
function MyFunction() {
var a = SomeValue, b = SomeVavlue2;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.