Должен ли я включить module.exports выше или ниже конструктора
Я использую Codacy для своего проекта и получаю предупреждение о том, что я не должен использовать переменные, которые я объявляю позже, что вполне логично. Тем не менее, это должно работать нормально для конструкторов.
Это моя основная структура файлов:
/* Export */
module.exports = myObject; // this line
/* Import */
var otherObject = require('./otherObject');
function myObject(input) {
}
myObject.prototype = {
}
Могут ли возникнуть какие-либо проблемы при экспорте до объявления конструктора объекта? Должен ли я переместить строку экспорта ниже конструктора, как?
1 ответ
Это поместит правильную функцию в module.exports
из-за подъема функции:
module.exports = myObject;
function myObject(input) {
}
Это положит undefined
в module.exports
(без ошибок) из-за подъема переменной:
module.exports = myObject;
var myObject = function (input) {
};
Это поднимет ReferenceError: myObject is not defined
исключение из-за let
обзорные правила:
module.exports = myObject;
let myObject = function (input) {
};
и так будет из-за const
обзорный:
module.exports = myObject;
const myObject = function (input) {
};
С другой стороны, все они будут работать так же, как и ожидалось, если вы положите module.exports = myObject;
в конце - что вам придется сделать в любом случае, если вы будете следовать, например, стилю кодирования Airbnb:
или если вы используете некоторые правила линтера, например, это правило ESLint:
Запретить раннее использование (не использовать перед определением)
В JavaScript до ES6 объявления переменных и функций поднимались в верхней части области видимости, поэтому можно использовать идентификаторы перед их формальными объявлениями в коде. Это может сбивать с толку, и некоторые считают, что лучше всегда объявлять переменные и функции перед их использованием.
В ES6 привязки на уровне блоков (let и const) вводят "временную мертвую зону", в которой ReferenceError будет выбрасываться при любой попытке доступа к переменной до ее объявления.