我应该在构造函数上方或下方包含 module.exports

Tho*_*s W 1 javascript module node.js codacy

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

这是我的主要文件结构:

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

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

function myObject(input) {
}

myObject.prototype = {
}
Run Code Online (Sandbox Code Playgroud)

在对象构造函数声明之前导出会出现任何问题吗?我应该将导出线移到构造函数下方吗?

rsp*_*rsp 5

由于函数提升,这将放入正确的函数:module.exports

\n\n
module.exports = myObject;\nfunction myObject(input) {\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将undefined放入module.exports没有错误):

\n\n
module.exports = myObject;\nvar myObject = function (input) {\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会引发ReferenceError: myObject is not defined 异常,因为let

\n\n
module.exports = myObject;\nlet myObject = function (input) {\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

这也是因为const

\n\n
module.exports = myObject;\nconst myObject = function (input) {\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

另一方面,如果您将所有这些都按预期工作module.exports = myObject;最后,所有这些都将按预期工作 - 如果你遵循例如 Airbnb 编码风格,你无论如何都必须这样做:

\n\n\n\n

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

\n\n\n\n
\n

禁止早期使用(定义前禁止使用)

\n\n

在 ES6 之前的 JavaScript 中,变量和函数声明被提升到作用域的顶部,因此可以在代码中的正式声明之前使用标识符。这可能会令人困惑,有些人认为最好在使用变量和函数之前先声明它们。

\n\n

在 ES6 中,块级绑定(let 和 const)引入了一个 \xe2\x80\x9c 临时死区\xe2\x80\x9d,在该死区中,任何在声明之前访问该变量的尝试都会引发 ReferenceError 。

\n
\n