let
1. 基本用法
let 聲明的變量,只在 let 所在代碼塊內有效。
for (let i = 0; i < 10; i++) {
// ...
}
console.log(i);// ReferenceError: i is not defined
上面的代碼中,變量 i 只在循環體 {} 中有效,在循環外調用就會報錯。
2.不存在變量提升
var 命令存在“變量提升”現象,變量在未聲明之前使用,值爲 undefined。
但是 let 聲明的變量一定要在聲明之後調用,否則會報錯。
// var 的情況
console.log(foo); // 輸出undefined
var foo = 2;
// let 的情況
console.log(bar); // 報錯ReferenceError
let bar = 2;
3. 暫時性死區
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
上面代碼中,存在全局變量 tmp ,但是在塊級作用域內 let 又聲明瞭一個 局部變量 tmp ,導致後者綁定這個塊級作用域,所以在 let 聲明變量前,對 tmp 賦值會報錯。
在代碼塊內,使用 let 命令聲明變量之前,該變量都是不可用的,這在語法上,稱爲“暫時性死區”(TDZ)。
4. 不允許重複聲明
let 不允許在相同作用域內,重複聲明同一個變量。
// 報錯
function func() {
let a = 10;
var a = 1;
}
function func(arg) {
{
let arg; // 不報錯
}
}
塊級作用域
ES5 只有 全局作用域和函數作用域,let 爲 JavaScript 增加了塊級作用域。
function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}
上面的函數有兩個代碼塊,都聲明瞭變量 n,運行後輸出5。這表示外層代碼塊不受內層代碼塊的影響。
const
1. 基本用法
const 聲明一個只讀常量,一旦聲明,常量的值就不能改變。這也意味着,const 一旦聲明變量,就必須進行初始化,不能之後在賦值。
const PI = 3.1415;
PI // 3.1415
PI = 3;// TypeError: Assignment to constant variable.
const foo;
// SyntaxError: Missing initializer in const declaration
此外,const 的用法和 let 相同。
- 不存在變量提升
- 存在暫時性死區
- 只在塊級作用域內有效
- 不可重複聲明