Какое значение "{" "}" фигурных скобок вокруг этого кода библиотеки реагирования?
Я собирался реагировать на код библиотеки. После прохождения я нашел специальный фрагмент кода, я не могу понять его значение. Может кто-нибудь помочь?
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 (...)
был пропущен при вставке кода, как показывает принятый ответ.