В строгом режиме (и в целом прилично освещенном коде) переменная должна быть объявлена до ее присвоения.Кроме того, переменные const
и let
должны быть объявлены один раз в блоке и не более.Повторное объявление err
(или любой другой переменной), которое уже было объявлено, приведет к ошибке, поэтому вы должны видеть let <varname>
только один раз в вашей функции describe('errorHandler'
:
const describe = cb => cb();
let something;
describe(() => {
something = 'foo';
});
let something;
describe(() => {
something = 'bar';
});
Далее describe
s внутри describe('errorHandler'
уже имеет доступ к области действия err
.
Без объявления переменнойВо-первых, присвоение ему в небрежном режиме приведет к тому, что он будет назначен глобальному объекту, что почти всегда нежелательно, и может привести к ошибкам и ошибкам .Например:
// Accidentally implicitly referencing window.status, which can only be a string:
status = false;
if (status) {
console.log('status is actually truthy!');
}
Тем не менее, часто рекомендуется держать переменные в максимально узкой области - присваивать внешней переменной только тогда, когда нужно значение ввнешняя сфера.Попробуйте объявить переменные только внутри присваивающих их describe
, что дает дополнительный бонус: вы можете использовать const
вместо let
:
describe('When the error is not an instance of SyntaxError', function() {
const err = getValidError(Error);
const req = {};
const res = {};
const next = spy();
const clonedRes = deepClone(res);
errorHandler(err, req, res, next);
// etc
});
// etc
describe('When the error is a SyntaxError, with a 400 status, has a `body` property set, and has type `entity.parse.failed`', function() {
const err = getValidError();
const req = {};
const res = {
status: spy(),
set: spy(),
json: spy()
};
const next = spy();
// etc