### let命令
* 基本用法
* 塊級作用域
* * * * *
#### 基本用法
> 在javascript **ES6之前**聲明一個變量的方式是通過**var**關鍵字,如:
~~~
var i = 0;
~~~
> ES6新增了**let**命令,用來聲明變量。它的用法類似于var,但是所聲明的變量,只在let命令所在的代碼塊 { } 內有效。如:
~~~
{
let a = 10;
var b = 1;
}
a // ReferenceError: a is not defined.
b // 1
~~~
> 通過let聲明的變量會綁定在當前代碼塊內,外部不可調用,沒有變量提升,不允許重復聲明,從而產生了塊級作用域,建議以后在ES6代碼中聲明變量不要使用var!
#### 塊級作用域
> ES5只有全局作用域和函數作用域,沒有塊級作用域,這帶來很多不合理的場景。第一種場景,內層變量可能會覆蓋外層變量。
~~~
var tmp = new Date();
function f() {
console.log(tmp);
if (false) {
var tmp = "hello world";
}
}
f(); // undefined
~~~
> 上面代碼中,函數f執行后,輸出結果為undefined,原因在于變量提升,導致內層的tmp變量覆蓋了外層的tmp變量。
> 第二種場景,用來計數的循環變量泄露為全局變量。
~~~
var s = 'hello';
for (var i = 0; i < s.length; i++) {
console.log(s[i]);
}
console.log(i); // 5
~~~
> 上面代碼中,變量i只用來控制循環,但是循環結束后,它并沒有消失,泄露成了全局變量。