ES6块级作用域变量定义作为条件

3

在C++中,您可以做到:

if (MyClass* obj = MyClass::getInstance()) { ... }

在JavaScript中,只有函数作用域变量的概念,因此以下语句无法实现。
if (var x = getTrueOrFalseValue()) { ... }

但是ES6引入了letconst关键字,它们声明的变量只能在块作用域内访问。为什么不能在if/while条件语句中使用呢?例如:
if (let x = getTrueOrFalseValue()) { ... }

我觉得这很酷,因为它不会在函数作用域中浪费未使用的变量,并且允许仅在if/while块作用域中使用它们。


1
这是你必须回答的问题之一:这是一个设计选择。 - CoderPi
你最好向TC39询问。 - Teemu
2
被认为无用的let (x = get…()) { }曾经被考虑过。 - Bergi
@CodeiSir,我认为那恐怕是最好的答案。 - Selenir
2个回答

2
我认为这是不可能的,因为let只能用作语句,而不能用作表达式。如果你尝试(let f = 3); 你也会得到一个错误。

0

这是最接近的,我能够得到的。

function getTrueOrFalseValue() {
  return true
}

if (!(x = void 0)) {
  let x = getTrueOrFalseValue();
  if (x) {
    console.log(x)
  }
}

function getTrueOrFalseValue() {
  return true
}
if (!(this["x"]) || !(x)) {
  let x = getTrueOrFalseValue();
  if (x) {
    console.log(x)
  }
}

jsfiddle https://jsfiddle.net/w0dptr37/,https://jsfiddle.net/w0dptr37/1/ - guest271314
1
这两个在真正的ES6中都会抛出异常。 - Bergi
如果你想要一个代码块,为什么不直接使用代码块,而要使用毫无意义的 if 语句呢? - Bergi
@Bergi 在 Chromium 49 上尝试过了,没有抛出任何异常。Chromium 49 是否暴露了“真正的 ES6”? - guest271314
@Bergi:“如果你想要一个块,为什么不直接使用一个块而不是一个无意义的if语句?”https://jsfiddle.net/w0dptr37/2/,https://jsfiddle.net/w0dptr37/3/ - guest271314
1
是的,就像那样,虽然你不需要在块中加上分号。 - Bergi

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