这个react库代码周围的“{”“}”大括号有什么意义?

IT技术 javascript reactjs ecmascript-6
2021-05-17 13:25:08

我正在浏览react库代码。经过我发现了一段特殊的代码,我无法理解它的意义。有人可以帮忙吗?

var validateFormat = function () {};

{
  validateFormat = function (format) {
    if (format === undefined) {
      throw new Error('invariant requires an error message argument');
    }
  };
}

这里为什么 React 开发人员将 validateFormat 包裹在花括号中?这样做有什么意义。

如果我执行以下操作,它的工作原理相同 -

var validateFormat = function () {};

validateFormat = function (format) {
   if (format === undefined) {
   throw new Error('invariant requires an error message argument');
   }
};
3个回答

块范围是他们babel-preset-fbjs 的结果如果您查看原始源代码,您会发现,该函数是根据 的值有条件地定义的__DEV__,因为它等效于process.env.NODE_ENV !== 'production'.

let validateFormat = () => {};

if (__DEV__) {
  validateFormat = function(format) {
    if (format === undefined) {
      throw new Error('invariant requires an error message argument');
    }
  };
}

这段代码很有意义。

var v = function () {};

{
  v = function (format) {
    // actual code
  };
}

第一个赋值定义v了一个空的占位符函数,以便代码不会中断。

第二个赋值包含函数实际代码它位于块作用域内,这是一个合法的 JS 构造。

但是……由于变量提升,块作用域没有任何作用,这会使任何与 C/C++ 专家预期相反的局部性无效。许多人说 JS 中没有块作用域,这是错误的。有块作用域,但它是无效的(除了最近的let/const声明)。

所以这段代码的作用是滥用无效的块语法来分离代码的视觉部分。

但是(这就是我认为这里正在发生的事情)我们在这里看到的只是一个示例我很可能想出另一个非常有意义的例子,例如:

var v = function () {};

{
  let localValue = 0;

  v = function (format) {
    // actual code using localValue
    localValue = 1;
  };
}

换句话说,您可能会在代码库中找到其他示例,这些示例通过let/来利用块作用域const并封装如图所示的定义。您给出的示例并未利用此机会,但范围界定仍然存在,因为:

  • 它不会破坏或破坏代码;
  • 均匀性;
  • 将来可能会增加更多的重量let/ const

这都是我的猜测。

这里的花括号是块语句在这种情况下,它们没有任何好的用途,可以安全地省略。块范围不适用于var. 即使是let,块语句也不会影响它,因为validateFormat它已经在块语句之外定义。

块语句有用的一个例子是:

let validateFormat = function () {};

{
  // doesn't reassign validateFormat from outer scope
  let validateFormat = function (format) {
    if (format === undefined) {
      throw new Error('invariant requires an error message argument');
    }
  };
  // validateFormat from block scope is used here
}

// validateFormat from outer scope is used here

答案提供了技术上正确的解释。这里真正的问题是,该问题包含错误的代码,因为if (...)粘贴代码时省略了语句,因此没有意义,如已接受的答案所示。