JavaScript中在分配多个值之前声明变量吗?

4
在Javascript中,哪种var声明格式更好:
function test1() {
  switch(type) {
    case 1:
        var test = "Hello One"
      break;
    case 2:
        var test = "Hello Two"
      break;
  }
}

或者:

function test2() {
  var test;

  switch(type) {
    case 1:
        test = "Hello One"
      break;
    case 2:
        test = "Hello Two"
      break;
  }
}

test2() 中,有1行额外的代码用于在赋值之前将 test 声明为一个 var,但这样可以避免声明两次 var test。哪种方式更好?

1
可能是javascript循环内var声明的重复问题 的重复问题,因为答案解释了这里发生的情况。(我相信还有其他几十个关于变量提升的问题。) - Evan Davis
其实,我更关心它的语法,而不是作用域方面发生了什么。不过了解“JavaScript提升”这个术语还是很好的! - projeqht
我理解这一点,但是对于为什么更喜欢某种语法的解释也说明了正在发生的事情。你不能只问其中一个而不问另一个。 - Evan Davis
3个回答

7

Javascript没有块级作用域,所以在switch语句块中声明变量并不能像你期望的那样工作。

此外,由于变量提升,函数块中所有变量声明都会被解释器提升到顶部,你的代码看起来就像这样:

function test1() {
  var test;
  var test;

  switch(type) {
    case 1:
        test = "Hello One"
      break;
    case 2:
        test = "Hello Two"
      break;
  }
}

完成起重后,很容易看出第一个块是不正确的原因。


1
你能澄清一下你在最后一句话中所说的“不正确”的意思吗?这两个例子都是有效的并且行为相同。(我不反对你在这个答案中所说的任何事情,但我认为使用一个更精确的术语比“不正确”更有帮助--也许是“不够清晰”?) - apsillers
@apsillers所说的“incorrect”意思是一种不良做法,静态分析工具(如jslint、jshint、resharper等)会标记它。 - jbabey
@apsillers 这真的是“有效的”吗?(有规范说明声明多次相同变量是可以接受的,还是它只是在实现中被忽略了?) - Evan Davis
5
是的,可以参考ECMAScript 10.5中的第8步骤:对于每个具有某个标识符dn的VariableDeclaration,解释器会检查该标识符是否已经在范围内声明,只有当它不存在时才会执行操作。 - apsillers
@apsillers 很好,这就是我想看到的。谢谢! - Evan Davis
@jbabey 谢谢,这是第一个示例中出现“错误”的一个很好的例子。 - apsillers

4

我认为第二种方式更好。

它更易于沟通,并且更接近实际情况(例如,变量提升)。

我也不喜欢将变量声明隐藏在看起来像作用域但实际上并不是的东西中。


2

你的第一段代码是错误的; 你声明了同一个变量多次。

JSHint会对此进行投诉。


4
但是解析器不会这样做。 - Evan Davis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接