Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript将var语句放在何处_Javascript - Fatal编程技术网

javascript将var语句放在何处

javascript将var语句放在何处,javascript,Javascript,我有一个函数如下所示: function SomeFunction() { var SomeVar; if (SomeCondition) { SomeVar = 4; } } 这相当于: function SomeFunction() { if (SomeCondition) { var SomeVar = 4; } } 仅在条件为真的情况下使用var声明是否会产生影响,是否存在与此相关的最佳实践或绩效影响 谢谢 编辑:是的,我知道没有块作用域

我有一个函数如下所示:

function SomeFunction() {

  var SomeVar;

  if (SomeCondition) {
     SomeVar = 4;
  }
}
这相当于:

function SomeFunction() {

  if (SomeCondition) {
     var SomeVar = 4;
  }
}
仅在条件为真的情况下使用var声明是否会产生影响,是否存在与此相关的最佳实践或绩效影响

谢谢


编辑:是的,我知道没有块作用域,只有函数作用域。

放置
var
语句的地方对代码没有影响。这纯粹是风格问题


有些人认为将
var
放在
函数
块的开头更清楚。Javascript中变量的生存期与声明它的函数相关联,而不是作用域。许多其他的花括号语言正好相反,这是许多新用户感到困惑的根源。因此,人们相信在函数开始时声明会导致更清晰的代码

这两者实际上是等价的。仔细阅读并阅读


就速度而言,最好使用第二种情况——在同一语句中组合声明和赋值。请参阅:

它们的功能完全相同,但有两种思想流派可以将其放在何处:

一个小组说你应该把它放在函数的顶部,因为这样可以避免你依赖的错误印象(不存在的)块范围

另一个小组说你应该把它放在适当的块中,因为这表明你打算把变量当作块作用域来处理,而不在其他任何地方使用它


据我所知,我是第二组的唯一成员。

在JavaScript中,像C/C++中那样的变量没有块作用域。因此,即使您在
if(){}
块中声明了变量,该变量实际上也会在函数的开头立即创建。这种“拉起”的效果通常称为“提升”


尽管这两个代码都是正确的,但第一个代码在语义上可能更好,因为它强调了一个事实,即无论
SomeCondition
是否为真,变量都存在。

将其放在函数的开头。在运行时,它总是被移动到那里,但是如果你把它放在真正执行的地方,它会清除混乱/不真实的假设

在你的例子中,第一个片段


(另外,纯风格,除了类camelCase,而不是PascalCase之外,其他所有的东西都要写标识符)

+1-如果您打算这样使用变量,我可以像在块作用域中一样声明它。我希望我能给您上一条语句第二次投票。@frenchie--解析阶段可能会稍微慢一点,但我对此表示怀疑,而且在任何情况下,都需要数百万行代码才能发现差异。一旦代码实际运行,就完全没有区别了。顺便说一句,你是法国人吗?这是一样的,第二个片段实际上总是被解释为第一个片段(但你可以从第二个片段中得出一些导致bug的假设)。正如其他人所指出的,它被称为“var提升”。@frenchie仅就文件大小而言,在一个缩小的文件中,手动提升可能比每个声明重2字节,但将它们组合在一起可以使您或编译器在组合
var
定义时减少4字节的文件大小。JSPerf上可能有一些东西在测试这一点,但我要概括地说,像这样的微优化在两个方向上几乎没有区别。JSPerf看起来真的差不多(到目前为止)除了Opera中一次运行的异常值之外,我还添加了几次函数运行,以模拟调用函数的频率比定义函数的频率更高的情况。我还添加了基本情况,其中从未设置任何变量。我的结果表明,将声明放在顶部不仅比放在块中快,甚至比不做作业都快!我真的要说的是,没有真正的性能影响。