2012-07-12 42 views
0

我有一個看起來像這樣的功能:的JavaScript放在哪裏var語句

function SomeFunction() { 

    var SomeVar; 

    if (SomeCondition) { 
    SomeVar = 4; 
    } 
} 

這相當於:

function SomeFunction() { 

    if (SomeCondition) { 
    var SomeVar = 4; 
    } 
} 

是否僅當使用條件爲真化妝var聲明是否有任何最佳做法或性能影響有關這方面?

謝謝。

編輯:是的,我知道有沒有塊範圍,只是功能範圍。

回答

0

這些都是實際上等價的。請閱讀"hoisting""function and block scope"

至於速度的話,你最好使用第二種情況 - 組合在同一個語句聲明和分配。請參閱:http://jsperf.com/stackoverflow-frenchie

+0

感謝您的回答。對性能有任何想法? – frenchie 2012-07-12 17:18:37

+0

我已經更新了我的答案,並有性能細分。 – Wex 2012-07-12 17:21:53

+0

JSPerf真的看起來像是差不多(到目前爲止),但在Opera中一次運行看起來像是異常值。 – 2012-07-12 18:08:20

3

var語句把對你的代碼沒有任何影響。這完全是一個風格問題。

有些人覺得把var放在function塊的開頭要清楚得多。 Javascript中變量的生命週期與其聲明的函數相關聯,而不是範圍。許多其他花括號的語言恰恰相反,這是許多新用戶的混淆之源。因此,人們相信在函數的開頭聲明會導致更清晰的代碼。

+0

感謝您的回答。對性能有任何想法? – frenchie 2012-07-12 17:18:29

+0

@frenchie不會對性能造成影響 – JaredPar 2012-07-12 17:23:42

4

他們的功能完全一樣,但也有在哪裏把它兩個思想流派:

一組說,你應該把它放在函數的頂部,因爲這避免了錯誤的印象,你依賴於(不存在的)塊範圍。

另一組說,你應該把它放在適當的塊,因爲這標誌着你打算把變量就好像它是塊範圍的,而不是使用任何其他地方。

據我所知,我是第二組的唯一成員。

+0

+1 - 對我來說,聲明變量就好像它在塊範圍中一樣,如果這就是你打算使用它的方式。 – Wex 2012-07-12 17:15:09

+0

我希望我可以給你第二個upvote爲你最後的聲明。 – 2012-07-12 17:16:34

+0

感謝您的回答。對性能有任何想法? – frenchie 2012-07-12 17:18:22

1

在JavaScript中,沒有像C/C++這樣的變量的塊範圍。因此,即使您在if() {}塊中聲明變量,該變量實際上也是在函數的開頭立即創建的。 「拉昇聲明」的效果通常稱爲「提升」。

儘管兩個代碼都是正確的,但第一個代碼在語義上可能更好,因爲它強調變量存在而不管SomeCondition是否爲真的事實。

+0

感謝您的回答。對性能有任何想法? – frenchie 2012-07-12 17:18:13

0

把它放在函數的開頭。無論如何,它在運行時總是被移動到那裏,但是如果你把它放在真正執行的地方,它會清除混淆/不真實的假設。

所以在你的情況下,第一個片段。

(也純粹的風格,除了寫類駝峯一切的標識,不PascalCase)

+0

感謝您的回答。對性能有任何想法? – frenchie 2012-07-12 17:18:03

+0

它也是一樣,第二個片段實際上總是被解釋爲它是第一個(但是你可以從第二個片斷中得出一些錯誤主導的假設)。正如其他人指出的那樣,它被稱爲「var提升」。 – 2012-07-12 17:19:24

+0

@frenchie在談到文件大小時,在縮小文件中,每次聲明手動提升可能會增加2個字節,但將它們組合在一起使您或編譯器在組合'var'定義時可以減小4個字節的文件大小。 JSPerf可能會對此進行測試,但我會推測這樣的微觀優化在兩個方向上幾乎沒有區別。 – 2012-07-12 17:23:16