let
聲明瞭一個塊級域的區域性變數,並且可以給它一個初始化值。
語法EDIT
let var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]];
引數
var1
,var2
, …,varN
- 變數名。變數名可以定義為任何合法識別符號。
value1
,value2
, …,valueN
- 變數的初始化值。該值可以為任何合法表示式。
描述EDIT
let
允許把變數的作用域限制在塊級域中。與 var
不同處是:var 申明變數要麼是全域性的,要麼是函式級的,而無法是塊級的。
在塊級域中用 let
用 let 在一個程式碼塊中定義變數.
if (x > y) {
let gamma = 12.7 + y;
i = gamma * x;
}
在用到內部函式的時候,let
能夠讓程式碼更簡潔,比如:
var list = document.getElementById("list");
for (var i = 1; i <= 5; i++) {
var item = document.createElement("LI");
item.appendChild(document.createTextNode("Item " + i));
let j = i;
item.onclick = function (ev) {
console.log("Item " + j + " is clicked.");
};
list.appendChild(item);
}
上面這段程式碼的意圖是建立5個li,點選不同的li能夠打印出當前li的序號。如果不用let,而改用var的話,將總是打印出 Item 5 is Clicked,因為 j 是函式級變數,5個內部函式都指向了同一個 j ,而 j 最後一次賦值是5。用了let後,j 變成塊級域(也就是花括號中的塊,每進入一次花括號就生成了一個塊級域),所以 5 個內部函式指向了不同的 j 。
作用域規則
用 let 定義的變數的作用域是定義它們的塊內,以及包含在這個塊中的子塊 ,這一點有點象var,只是var 定義的變數的作用域是定義它們的函式內 :
function varTest() {
var x = 31;
if (true) {
var x = 71; // same variable!
console.log(x); // 71
}
console.log(x); // 71
}
function letTest() {
let x = 31;
if (true) {
let x = 71; // different variable
console.log(x); // 71
}
console.log(x); // 31
}
在程式或者函式的頂層,let 的表現就象 var 一樣:
var x = 'global';
let y = 'global';
console.log(this.x);
console.log(this.y);
上面這段程式碼的執行後會顯示兩次"global"。
注:在 Safari[版本 9.1.1 (9537.86.6.17)]與 chrome[ 版本50.0.2661.102 (64-bit)]中 y 將是 undefined
let 的暫存死區與錯誤
在同一個函式或同一個作用域中用let重複定義一個變數將引起 TypeError
.
if (x) {
let foo;
let foo; // TypeError thrown.
}
在 ECMAScript 2015中, let
將會提升這個變數到語句塊的頂部。然而,在這個語句塊中,在變數宣告之前引用這個變數會導致一個 ReferenceError的結果
, 因為let變數 在"暫存死區" (從塊的開始到宣告這段).
function do_something() {
console.log(foo); // ReferenceError
let foo = 2;
}
在 switch
宣告中你可能會遇到這樣的錯誤,因為一個switch只有一個作用塊.
switch (x) {
case 0:
let foo;
break;
case 1:
let foo; // TypeError for redeclaration.
break;
}
迴圈定義中的let作用域
迴圈體中是可以引用在for申明時用let定義的變數,儘管let不是出現在大括號之間.
var i=0;
for ( let i=i ; i < 10 ; i++ ) {
console.log(i);
}
注:以上 let 申明的 i 將會變成 undefined;chrome 版本50.0.2661.102 (64-bit);推薦以下寫法:
var i=0;
for ( let l = i ; l < 10 ; l++ ) {
console.log(l);
}
域作用規則
for (let expr1; expr2; expr3) statement
在這個例子中,expr2, expr3, 和 statement 都是包含在一個隱含域塊中,其中也包含了 expr1.
例子EDIT
let
對比 var
let的作用域是塊,而var的作用域是函式
var a = 5;
var b = 10;
if (a === 5) {
let a = 4; // The scope is inside the if-block
var b = 1; // The scope is inside the function
console.log(a); // 4
console.log(b); // 1
}
console.log(a); // 5
console.log(b); // 1
let
在迴圈中
可以用 let 來代替 var ,在 for 定義塊中使用塊級變數.
for (let i = 0; i<10; i++) {
console.log(i); // 0, 1, 2, 3, 4 ... 9
}
console.log(i); // i is not defined
非標準的 let 擴充套件EDIT
let塊(
let
block)
let blocks 在 Gecko 44 中已經廢除( bug 1167029) 。
let塊
提供了一種在塊的範圍內獲取變數的值,而不會影響塊外面名字相同的變數的值的方法。
語法
let (var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]) block;
描述
let 語句塊為變數提供了局部作用域。它的作用是在單一程式碼塊的詞法範圍內繫結零個或多個變數; 此外與普通語句塊沒有任何區別。需要特別注意的是, 在 let
語句塊內使用 var 宣告的變數,它的作用域與在 let 語句塊之外宣告沒有區別;這樣的變數仍然具有函式作用域。在使用 let
語句塊時,必須使用花括號,否則會導致語法錯誤。
例子
var x = 5;
var y = 0;
let (x = x+10, y = 12) {
console.log(x+y); // 27
}
console.log(x + y); // 5
let 程式碼塊的規則與 JavaScript 中其他型別的程式碼塊相同。允許在塊內通過 let 關鍵字宣告區域性變數。
作用域規則
使用 let
語句塊繫結的變數,其作用域是 let
語句塊本身,與任何其內部語句塊的作用域一樣,除非在這些內部語句塊內又定義了同名的變數。
let
表示式( let expression)
let
expression 在 Gecko 41 已經廢除
let
表示式 可以將變數的作用域僅作用於一條語句。
語法
let (var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]) expression;
例子
你可以在一條語句的範圍中使用 let
關鍵字來設立變數:
var a = 5;
let(a = 6) console.log(a); // 6
console.log(a); // 5
作用域規則
給定一個 let
表示式:
let (decls) expr