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'); };