【问题标题】:What is the significance of "{" "}" braces around this react library code? [closed]这个反应库代码周围的“{”“}”大括号有什么意义? [关闭]
【发布时间】:2019-05-25 07:10:30
【问题描述】:

我正在浏览 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');
   }
};

【问题讨论】:

  • 你能引用这个来源吗?它们似乎是多余的,但我猜你为了演示而“简化了代码”,只是让它们看起来是多余的。
  • 它在函数周围创建一个块。但是由于使用 vars 时没有块作用域,所以这样写没有意义。想到的可能解释是:1)转译的代码,2)没有经验的开发人员,3)曾经有一个被删除的块上的标签。
  • @Shilly since there's no block scope in JS 是错误的。从 ES6 开始,letconst 是块作用域声明。
  • @abhishekgangwar here 中有大约 100 个文件。为我们节省一些时间和edit您的问题以正确引用此来源。
  • 这个问题实际上是题外话,因为它是由错误粘贴的代码引起的。

标签: javascript reactjs ecmascript-6


【解决方案1】:

块作用域是他们babel-preset-fbjs 的结果。如果您查看original source,您会发现相反,此函数是根据__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');
    }
  };
}

【讨论】:

  • 是的,这里的问题是代码被错误引用了。
【解决方案2】:

这段代码非常有意义。

var v = function () {};

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

第一个赋值将v 定义为一个空的占位符函数,这样代码就不会中断。

第二个赋值包含函数的实际代码。它在一个 block scope 内,这是一个合法的 JS 构造。

但是... 块作用域 什么都不做 因为变量提升,这会使任何与 C/C++ 专家期望相反的局部性无效。许多人说 JS 中没有块作用域,这是错误的。有块范围,但它无效(除了最近的let/const 声明)。

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

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

var v = function () {};

{
  let localValue = 0;

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

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

  • 它不会破坏或破坏代码;
  • 均匀度;
  • 未来可能会增加权重添加let/const

这都是我的猜测。

【讨论】:

    【解决方案3】:

    这里的大括号是block statement。在这种情况下,它们没有任何好处,可以放心地省略。 Block scope 不适用于 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 (...) 语句,正如接受的答案所示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 2012-08-01
      相关资源
      最近更新 更多