由于功能提升,这将放入正确的功能: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 规则:
禁止早期使用(no-use-before-define)
在 JavaScript 中,在 ES6 之前,变量和函数声明被提升到作用域的顶部,因此可以在代码中的正式声明之前使用标识符。这可能会令人困惑,有些人认为最好在使用变量和函数之前始终声明它们。
在 ES6 中,块级绑定(let 和 const)引入了一个“临时死区”,在该区域中,任何尝试在声明之前访问变量都会抛出 ReferenceError。