let命令javascript
爲es6新增命令,用來聲明變量,相似於var,可是let所聲明的變量,只在let命令所在的塊級做用域內有效java
塊級做用域寫法(ES6塊級做用域容許任意嵌套):es6
// 塊級做用域寫法 { let tmp = ...; ... }
塊級做用域例1數組
for (let i = 0; i < 10; i++) { // ... } console.log(i);
//ReferenceError: i is not defined
解析:上面代碼中,i的做用域是for循環體內,在循環體外引用就會報錯。函數
塊級做用域例2spa
function f1() { let n = 5; if (true) { let n = 10; } return n }
console.log(f1())//5
解析:栗子說明,外層代碼塊不受內層代碼塊的影響。code
---------------------------------------------------------------------------------------------------------------------------------blog
let與var的區別ip
1.var 沒有塊級做用域,let有塊級做用域內存
var實例
var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10
分析:代碼中,i在全局範圍內有效,因此全局只要一個變量i。每一次循環,變量i的值都會發生變化,而數組a函數內部的console.log(i),裏面的i和全局i爲同一個。
let實例
var a = []; for (let i = 0; i < 10; i++) {
a[i] = function () { console.log(i); }; } a[6](); // 6
分析:代碼中的i使用let聲明的,只在本輪循環有效,每一次循環的i其實都是一個新的變量(why?javascript引擎內部會記住上一輪循環的值,初始化本輪的變量i時,就在上一輪循環的基礎上進行計算)
另外,for
循環還有一個特別之處,就是設置循環變量的那部分是一個父做用域,而循環體內部是一個單獨的子做用域。
for (let i = 0; i < 3; i++) { let i = 'abc'; console.log(i); }
2.var 存在變量提高,let不存在變量提高("變量提高"是指變量能夠在聲明以前使用,值爲undefined·)
例:
/ var 的狀況 console.log(foo); // 輸出undefined var foo = 2; // let 的狀況 console.log(bar); // 報錯ReferenceError let bar = 2;
3.let暫時性死區
只要塊級做用域內存在let命令,它所聲明的變量的做用域就是這個區域,
例如
var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; }
解析:tmp的做用域爲塊級做用域,報錯緣由:未聲明直接使用,
4.let不容許重複聲明
let不容許在相同的做用域內,重複聲明同一個變量
例子
// 報錯 Uncaught SyntaxError: Identifier 'a' has already been declared function func() { let a = 10; var a = 1; } // 報錯 function func() { let a = 10; let a = 1; }
擴展:不能在函數內部從新聲明參數
function func(arg) { let arg; // 報錯,相同的做用域內 } function func(arg) { { let arg; // 不報錯 函數參數arg 和此處的arg不在同一個做用域內 } }
總結:
1.let命令有塊級做用域
2.let命令先聲明再使用
3.let命令不可重複聲明(同一做用域)
相關資料:http://es6.ruanyifeng.com/#docs/let
做者:smile.轉角
QQ:493177502