Javascript ES6块作用域变量定义为条件 在C++中你可以做< /P> if (MyClass* obj = MyClass::getInstance()) { ... }

Javascript ES6块作用域变量定义为条件 在C++中你可以做< /P> if (MyClass* obj = MyClass::getInstance()) { ... },javascript,variables,ecmascript-6,Javascript,Variables,Ecmascript 6,在JavaScript中,只有函数范围的变量,所以下面的语句没有意义 if (var x = getTrueOrFalseValue()) { ... } 但ES6引入了let和const关键字,它们声明变量只能在块范围内访问。为什么不允许在if/while条件下使用它?例如: if (let x = getTrueOrFalseValue()) { ... } 我觉得这很酷,因为它不会用未使用的变量破坏函数作用域,只允许在if/while块作用域中使用它们。我认为这是不可能的,因为let只

在JavaScript中,只有函数范围的变量,所以下面的语句没有意义

if (var x = getTrueOrFalseValue()) { ... }
但ES6引入了
let
const
关键字,它们声明变量只能在块范围内访问。为什么不允许在if/while条件下使用它?例如:

if (let x = getTrueOrFalseValue()) { ... }

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

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

这是您能得到的最接近的错误,在这里

function getTrueOrFalseValue() {
  return true
}

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


这是你必须回答的问题之一:这是一个设计选择。你最好问这个问题。被认为是无用的。@CodeiSir,不幸的是,我认为这是最好的答案。jsfiddle,这两个都会在真实的ES6中引发异常。如果你想要一个块,为什么不使用块而不是一个无意义的if语句呢?@Bergi在chromium 49尝试过,没有引发异常。chromium 49是否公开“真正的ES6”?是的,就像那样,尽管您不需要用分号包装您的块
function getTrueOrFalseValue() {
  return true
}
if (!(this["x"]) || !(x)) {
  let x = getTrueOrFalseValue();
  if (x) {
    console.log(x)
  }
}