es6笔记1:let和const
es6入门:let和const
顶层对象:在浏览器环境指的是window对象,ES5 之中,顶层对象的属性与全局变量是等价的。
ES6 一共有 6 种声明变量的方法:
var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定, let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。
let,const和var有区别
1.let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性
2.作用域的范围不同
块级作用域
let const所声明的变量,只在该命令所在的代码块内有效。
let实际上为 JavaScript 新增了块级作用域。
而创建这个块级作用域必须加有大括号,这个大括号内就是一个代码块。
特例
其中for循环有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。
let可以解决这个循环外取值的问题:
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
块级作用域和let,const变量的关系
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响
绑定是指: 相同的变量a,如果在外部声明了a,而内部使用let内部又声明了a,那么这个变量a绑定这个内部的区域,不受外部影响
使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”
所以,在没有let之前,typeof运算符是百分之百安全的,永远不会报错。现在这一点不成立了。
这样的设计是为了让大家养成良好的编程习惯,变量一定要在声明之后使用
块级作用域中声明函数
ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。
考虑到环境导致的行为差异太大,建议不要使用,如果需要优先使用函数表达式
3. let const不存在变量提升
书中说在未声明前使用该变量将会直接报错,但其实在谷歌浏览器实验后发现let,const在未声明前使用该变量并没有报错,console.log打印后是undefined,可能是浏览器做了向下兼容的处理吧
4.不允许在相同作用域内,重复声明同一个变量
不能在函数内部重新声明参数
允许在块级作用域内声明函数。
函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
同时,函数声明还会提升到所在的块级作用域的头部。
const
const初始化后必须赋值,否则报错,且这个值声明后就不能更改
const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心
如果真的想将对象冻结,应该使用Object.freeze方法