【问题标题】:Should I include module.exports above or below constructor我应该在构造函数上方还是下方包含 module.exports
【发布时间】:2017-07-03 09:18:02
【问题描述】:

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

这是我的主要文件结构:

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

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

function myObject(input) {
}

myObject.prototype = {
}

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

【问题讨论】:

  • 它适用于函数声明,而不是构造函数。无论如何,这或多或少是风格问题。你可以把它放在你最喜欢的地方。不过,if (module) 没有多大意义。
  • @Ryan 感谢if (module) 的提示,我使用它是因为我在其他项目中看到它,但确实没有必要。
  • 看看吊装。你所有的代码都在你的函数声明后面......

标签: javascript node.js module codacy


【解决方案1】:

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

module.exports = myObject;
function myObject(input) {
}

由于变量提升,这会将 undefined 放入 module.exports(没有错误):

module.exports = myObject;
var myObject = function (input) {
};

由于let 范围规则,这将引发ReferenceError: myObject is not defined 异常

module.exports = myObject;
let myObject = function (input) {
};

由于const 作用域,这也是如此:

module.exports = myObject;
const myObject = function (input) {
};

另一方面,如果您将 module.exports = myObject; 放在末尾,所有这些都将按预期工作 - 如果您遵循例如,您将不得不这样做。 Airbnb 编码风格:

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

禁止早期使用(no-use-before-define)

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

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

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 2016-02-20
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2011-04-11
    • 2020-10-02
    • 1970-01-01
    • 2011-03-03
    相关资源
    最近更新 更多