ES 5 以及之前的版本只有 全局作用域
和 函数作用域
两种作用域,在 ES 6 标准中引入了块级作用域这个概念,随之新增了 let
与 const
两种变量声明方式。
1 | x = "global"; // 挂载到全局作用域中 |
以上的函数作用域实际过程如下:
1 | (function() { |
块级作用域的过程:
1 | { |
巧妙玩弄(?) 暂时死区:
1 | let x = x; // Uncaught ReferenceError: x is not defined |
x 被困在暂时死区中,此后该作用域中 x 无法使用。
函数提升
在红宝书上看到了这个概念,区别函数提升与变量提升:
1 | alert(sum(10,10)); // TypeError: sum is not a function |
以上代码会报错,因为虽然 sum 被提升了,但是初始化在后面。
1 | alert(sum(10,10)); |
相应的,直接声明函数的形式,因为函数提升直接初始化,所以代码正确运行。
参考
Are variables declared with let or const not hoisted in ES6?