我正在使用Codacy作为我的项目,并且我收到一条警告,说我不应该使用我后来声明的变量,这是非常合乎逻辑的。但是,这应该适用于构造函数。
这是我的主要文件结构:
/* Export */
module.exports = myObject; // this line
/* Import */
var otherObject = require('./otherObject');
function myObject(input) {
}
myObject.prototype = {
}
在对象构造函数声明之前导出是否会出现任何问题?我应该将导出行移动到构造函数下面吗?
答案 0 :(得分:2)
由于功能提升,这会在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规则:
禁止早期使用(不使用之前定义)
在JavaScript中,在ES6之前,变量和函数声明被提升到作用域的顶部,因此可以在代码中的正式声明之前使用标识符。这可能令人困惑,有些人认为最好在使用之前声明变量和函数。
在ES6中,块级绑定(let和const)引入了一个“临时死区”,其中将抛出ReferenceError,并在声明之前尝试访问该变量。