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);
那么它的作品!
我不明白为什么会发生这种情况。 我认为const
和let
就像var
一样被挂起,但是这让我相信我错了。
题
有人能解释我这种行为吗?
有一件事是const
或者let
var
与var
不同的是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 = () => {};