Какое значение "{" "}" фигурных скобок вокруг этого кода библиотеки реагирования?

Я собирался реагировать на код библиотеки. После прохождения я нашел специальный фрагмент кода, я не могу понять его значение. Может кто-нибудь помочь?

var validateFormat = function () {};

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

Вот почему реагирующий разработчик обернул validateFormat в фигурные скобки? есть ли смысл делать это.

Если я делаю следующее, он работает так же -

var validateFormat = function () {};

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

Ответ 1

Область видимости блока является результатом их 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');
    }
  };
}

Ответ 2

Этот код имеет смысл.

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.

Это все догадки с моей стороны.

Ответ 3

Фигурные скобки здесь - это блочные операторы. Они не служат никакой хорошей цели в этом случае и могут быть безопасно опущены. Область видимости блока не работает с 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 (...) оператор if (...) был пропущен при вставке кода, как показывает принятый ответ.