我应该在构造函数之上还是之下包含 module.exports

Should I include module.exports above or below constructor

我正在为我的项目使用 Codacy,我收到一条警告说我不应该使用我稍后声明的变量,这是很合乎逻辑的。但是,这对于构造函数应该可以正常工作。

这是我的主要文件结构:

/* Export */
module.exports = myObject; // this line

/* Import */
var otherObject = require('./otherObject');

function myObject(input) {
}

myObject.prototype = {
}

在对象构造函数声明之前导出会不会有什么问题?我应该将导出行移动到构造函数下方吗?

由于函数提升,这会将 正确的函数 放入 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 编码风格:

或者如果您使用一些 linter 规则,例如这个 ESLint 规则:

Disallow Early Use (no-use-before-define)

In JavaScript, prior to ES6, variable and function declarations are hoisted to the top of a scope, so it’s possible to use identifiers before their formal declarations in code. This can be confusing and some believe it is best to always declare variables and functions before using them.

In ES6, block-level bindings (let and const) introduce a “temporal dead zone” where a ReferenceError will be thrown with any attempt to access the variable before its declaration.