Let命令
基本用法
声明变量(只在let命令所在的代码块内有效)
*var全局变量都有效
不存在变量提升
Var发生“变量提升”,undefined的最初值就是原始数据类型undefined。
Let在脚本运行前,并不存在原始数据,会报错
暂时性死区
ES6中,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
在代码块内,使用let声明变量之前,该变量不可用,成为称谓“暂时性死区”(TDZ)(进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。)
在let声明变量tmp之前,都属于tmp死区
在没有let之前,typeof运算符是百分之百安全的,永远不会报错。但是,“暂时性死区”会使typeof出现报错。
不允许重复声明
Let不允许在相同作用域内,重复声明同一个变量。
块级作用域
Es6的块级作用域(Let为js新增了块级作用域)es5只有全局作用域和函数作用域
允许块级作用域的任意嵌套(内层作用域可以定义外层作用域的同名变量)
块级作用域与函数声明
Es5中函数只能在等曾作用域和函数作用域中声明
ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。(浏览器的实现可以不遵守规定,有自己的行为方式)
Es6的块级作用域必须有大括号,如果没有大括号,js引擎就认为不存在块级作用域。
Const命令
基本用法
Const声明一个只读的常量,一旦声明,常量的值就不能改变。
const只在声明所在的块级作用域内有效,const声明的变量也是不提升,存在暂时性死区,不可重复声明。
*const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。
Es6声明变量的方法
ES5 声明变量的方法:var命令和function命令。
ES6 声明变量的方法:let和const命令,import命令和class命令。
顶层对象的属性
顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象。
ES6为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性(let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。)
Globalthis对象
js存在一个顶层对象,提供全局环境(即全局作用域),所有代码都是在这个环境中运行。
*全局环境中,this会返回顶层对象。但是,Node.js 模块中this返回的是当前模块,ES6 模块中this返回的是undefined。
*函数里面的this,如果函数不是作为对象的方法运行,而是单纯作为函数运行,this会指向顶层对象。但是,严格模式下,这时this会返回undefined。
*不管是严格模式,还是普通模式,new Function('return this')(),总是会返回全局对象。但是,如果浏览器用了 CSP(Content Security Policy,内容安全策略),eval、new Function这些方法都可能无法使用。
任何环境下,globalthis都是存在的,指向全局环境下的this。