1、let命令
基本用法
用來聲明變量,類似于var,但是所聲明的變量只在let命令所在的代碼塊內有效。
for循環中適合使用let:
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6]();//6,如果用var聲明i,輸出會是10。
不存在變量提升
let命令不會提升聲明,即先使用后聲明不會返回undefined,會直接報錯。
// var 的情況
console.log(a); // 輸出undefined
var a= 2;
// let 的情況
console.log(a); // 報錯
let a= 2;
暫時性死區
當前作用域存在let命令時,其聲明的變量將綁定這個區域,不受外部影響,即必須要在聲明之后,才能使用此變量,即使它在外部已聲明過。
任何在聲明語句執行結束前的使用都會報錯,包括typeof檢測。
其本質是:只要進入當前作用域,所有變量就已存在,但不可獲取,只有當聲明變量那行代碼執行完畢,才可獲取和使用。
a=1; // 報錯
let a;
typeof a; // 報錯
let a; //如果使用的是var,上一行代碼會返回undefined
不允許重復聲明
let不允許在相同作用域內,重復聲明同一個變量。
// 報錯
function () {
let a = 10;
var a = 1;
}
// 報錯
function () {
let a = 10;
let a = 1;
}
2、塊級作用域
ES6 的塊級作用域
let實際上為JavaScript新增了塊級作用域
function fun() {
let a = 5;
if (true) {
let a = 10;
}
console.log(a); // 5
}
塊級作用域的出現,讓立即執行行數表達式可以簡化:
(function () {
var a = ...;
...
}());
//簡化為:
{
let a = ...;
...
}
塊級作用域與函數聲明
在塊級作用域內,應盡量避免聲明函數,若必須聲明,則應該寫成行數表達式,而不是函數聲明,因為函數聲明會被提升到塊級作用域的頭部。
(function () {
if (false) {
function f() { console.log('I am inside!'); }
}
f();
}());
//因為函數聲明提升,上述代碼在ES6中實際相當于:
(function () {
var f = undefined;
if (false) {
function f() { console.log('I am inside!'); }
}
f();//此時f不是一個函數,會報錯。
}());
3、const命令
基本用法
const命令聲明的是一個常量,一旦聲明,就不允許改變。
所以聲明時必須初始化,只聲明不賦值的const命令會報錯。
const聲明與let相似:
- 不提升變量。
- 存在暫時性死區。
- 只在聲明后使用。
- 只在塊級作用域內有效。
- 不可重復聲明。
const命令聲明對象時,此對象的屬性的值依然可改變,對象本身不可改為新對象,聲明數組時同理。
const obj= {};
// 為 obj 添加一個屬性,可以成功
obj.pro = 123;
obj.pro // 123
// 將 obj 指向另一個對象,就會報錯
obj= {};
const a = [];
a.push('Hello'); // 可執行
a.length = 0; // 可執行
a = ['world']; // 報錯
4、頂層對象的屬性
瀏覽器環境下頂層對象是指window對象。
var、function聲明的全局變量是window對象的屬性,let、const、class聲明的變量則不是。