1、let命令是es6新增的特性,做用与var命令相似,声明变量,不一样之处在于声明的变量的做用域为块级做用域。引入let后带来了不少新的特性。javascript
1做用域,es5以前以后函数做用域和全局做用域,let的引入带来了块级做用域,块级做用于会带来不少新的改变。java
2一个须要了解的是“暂时性死区”,好比在全局变量tmp
,可是块级做用域内let
又声明了一个局部变量tmp
,致使后者绑定这个块级做用域,因此在let
声明变量前,对tmp
赋值会报错。es6
3ES5 规定,函数只能在顶层做用域和函数做用域之中声明,“{}”内声明。ES6 引入了块级做用域,明确容许在块级做用域之中声明函数。可是块级做用域内声明的函数相似于let
,对做用域以外没有影响。考虑到兼容性问题,此规则浏览器不必定遵照。数组
2、const命令声明一个常量,必须在声明的同时赋值,以后不能再改变其值。声明的变量同let认同块级做用域,不能提高,也存在暂时性死区,不可重复声明。const实质上并非保证声明的量不改变,只能保证他的指向的地址不能改变。当只想数组、对象时,能够对指向的数组、对象进行赋值操做。浏览器
3、顶层对象属性,顶层对象在浏览器中指的是window。顶层对象与var声明的全局变量挂钩,对的声明的变量a进行赋值,等同于对window.a进行赋值。let、const、class、import声明的变量可以成功避免这一个现象。函数
很难找到一种方法,能够在全部状况下,都取到顶层对象。下面是两种勉强可使用的方法。ui
// 方法一 (typeof window !== 'undefined' ? window : (typeof process === 'object' && typeof require === 'function' && typeof global === 'object') ? global : this); // 方法二 var getGlobal = function () { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } throw new Error('unable to locate global object'); };