1

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

这是我的主要文件结构:

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

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

function myObject(input) {
}

myObject.prototype = {
}

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

4

1 回答 1

4

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

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

由于变量提升,这将放入undefinedmodule.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 规则:

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

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

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

于 2017-07-03T10:36:02.267 回答