2012-07-12 70 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