在es6中,新增了let命令,其和var声明一样的,但是let只能在其声明的作用域范围内使用
在for循环时,因为这一特性,我们可以将循环下标用let声明,因为这样下标索引i的值在外部访问不到,还要记住for循环一个特殊点,设置的循环变量的那一部分是父作用域,而循环本体内部是一个单独的子作用域。
let注意点:
在同一个作用域内,不允许同时出现let和let,let和var
let不存在变量提升,在变量未声明之前和使用它的那一段叫做暂时性死区
块级作用域
目的:
解决内层变量户会覆盖外层变量的问题
避免用来计数的循环变量泄露为全局变量
外层作用域范围无法读取内层变量
因为浏览器,es5和es6功能有矛盾的部分,所以应该避免在块级作用域内声明函数,如果确实有需要,应该把函数写成函数表达式,而不是函数声明式。
const声明一个只读的常量,一旦声明之后,常量的值就不会改变。
const注意点:
一旦一个变量用const声明后,只要声明就要马上赋值,立即进行初始化,不能等到以后在赋值。
const也只在声明的块级作用域内有效
const也存在暂时性死区
const实际上保证的并不是变量的值不变,而是变量指向的那个内存地址所保存的数据不得改变,对于原始值,它基本就相当于一个不变的常量,对于一个对象,它保存的是这个指针是固定的,也就是它总是指向另一个固定的地址,它里面的数据结构可不可变,是完全不能控制的。
顶层对象属性
浏览器的顶层对象为window,node的顶层对象为global
在全局对象下用var声明的变量,用window.变量名,是可以访问到其值的
而在用let声明的变量,用window.变量名是访问不到的,这样就说明从es6开始全局变量属性逐步与顶层对象属性脱钩。
globalThis对象
js语言存在一个顶层对象,即存在一个全局环境(即全局作用域),所有代码都是在这个环境中运行,但是在各种实现里,全局对象是不统一的。
浏览器是window
浏览器和web worker里面,self也指向顶层对象
node里面,顶层对象为global,但其他环境不支持