Javascript “的意义是什么?”;{quot;};这个库代码周围的大括号?

Javascript “的意义是什么?”;{quot;};这个库代码周围的大括号?,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我正在浏览react库代码。在浏览之后,我发现了一段特殊的代码,我无法理解它的意义。有人能帮忙吗 var validateFormat = function () {}; { validateFormat = function (format) { if (format === undefined) { throw new Error('invariant requires an error message argument'); } }; } 为什么re

我正在浏览react库代码。在浏览之后,我发现了一段特殊的代码,我无法理解它的意义。有人能帮忙吗

var validateFormat = function () {};

{
  validateFormat = function (format) {
    if (format === undefined) {
      throw new Error('invariant requires an error message argument');
    }
  };
}
为什么react developer将validateFormat包装成大括号?这样做有什么意义吗

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

var validateFormat = function () {};

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
利用块作用域,并封装定义,如图所示。您给出的示例并未利用此机会,但范围仍然存在,因为:

  • 它不会中断或破坏代码
  • 一致性
  • 将来可能会增加更多的重量,让/
    常数

这完全是我的猜测。

块范围是他们的结果。如果查看,您会发现此函数是根据
\uuu DEV\uuu
的值有条件地定义的,该值在传输过程中优化,因为它等效于

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

块语句有用的示例如下:

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(…)
语句被省略了,正如公认的答案所示。

你能引用这个源代码吗?它们似乎是多余的,但我猜你为了表现而“简化了代码”,只是让它们显得多余。这会在函数周围创建一个块。但是,由于使用vars时没有块作用域,所以用这种方式编写没有任何意义。我想到的可能解释是:1)传输的代码,2)没有经验的开发人员,3)删除的块上曾经有一个标签。@Shilly
因为JS中没有块作用域是错误的。从ES6
开始,让
const
是块范围声明。@abhishekgangwar中大约有100个文件。为我们节省一些时间和您的问题,以便正确引用此源代码。这个问题实际上是离题的,因为它是由错误粘贴的代码引起的。是的,这里的问题是代码被错误引用。
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