JavaScript:提升let,const的区别?

背景

我有一个负责生成一个随机数并使其可用的函数。

"use strict"; module.exports = function(args) { let { min, max, } = args; let currNumber = genRandom(min, max); const genRandom = (min, max) => Math.floor(Math.random() * max) + min; const getNumber = () => currNumber; return Object.freeze({ getNumber }); }; 

问题

由于我不明白的原因,当我运行这个代码与Node.js 7.8,我得到的genRandom is not defined的错误。

但是,如果我改变了代码:

 let currNumber = genRandom(min, max); const genRandom = (min, max) => Math.floor(Math.random() * max) + min; 

至:

 const genRandom = (min, max) => Math.floor(Math.random() * max) + min; let currNumber = genRandom(min, max); 

那么它的作品!

我不明白为什么会发生这种情况。 我认为constlet就像var一样被挂起,但是这让我相信我错了。

有人能解释我这种行为吗?

有一件事是const或者let varvar不同的是variables在声明之前是不可访问的。

只需检查规范: http : //www.ecma-international.org/ecma-262/6.0/#sec-let-and-const-declarations

当它们包含词法环境被实例化时,这些variables被创build,但是在评估variables的LexicalBinding之前,不能以任何方式被访问

句法

LexicalDeclaration [产量]
LetOrConst BindingList [?In,?Yield] ;

LetOrConst

常量

BindingList [In,Yield]
LexicalBinding [?In,?Yield]
BindingList [?In,?Yield]LexicalBinding [?In,?Yield]

LexicalBinding [产量]
BindingIdentifier [?Yield] 初始化程序 [?In,?Yield] opt
BindingPattern [?Yield] 初始化程序 [?In,?Yield]

我认为const和let就像var一样被挂起,但是这让我相信我错了。

一点都不。 但即使是这样,你仍然会得到一个(不同的)错误,因为getRandom的值在你调用它的时候是undefined的。 即使使用var ,也只是声明被提升,而不是你初始化variables的值:

 console.log(typeof foo); // "undefined" foo(); // TypeError: foo is not a function var foo = () => {};