1谎亩、let命令
基本用法
用來(lái)聲明變量炒嘲,類似于var,但是所聲明的變量只在let命令所在的代碼塊內(nèi)有效匈庭。
for循環(huán)中適合使用let:
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6]();//6夫凸,如果用var聲明i,輸出會(huì)是10嚎花。
不存在變量提升
let命令不會(huì)提升聲明寸痢,即先使用后聲明不會(huì)返回undefined,會(huì)直接報(bào)錯(cuò)紊选。
// var 的情況
console.log(a); // 輸出undefined
var a= 2;
// let 的情況
console.log(a); // 報(bào)錯(cuò)
let a= 2;
暫時(shí)性死區(qū)
當(dāng)前作用域存在let命令時(shí),其聲明的變量將綁定這個(gè)區(qū)域道逗,不受外部影響兵罢,即必須要在聲明之后,才能使用此變量滓窍,即使它在外部已聲明過(guò)卖词。
任何在聲明語(yǔ)句執(zhí)行結(jié)束前的使用都會(huì)報(bào)錯(cuò),包括typeof檢測(cè)吏夯。
其本質(zhì)是:只要進(jìn)入當(dāng)前作用域此蜈,所有變量就已存在摊欠,但不可獲取移斩,只有當(dāng)聲明變量那行代碼執(zhí)行完畢润歉,才可獲取和使用绷跑。
a=1; // 報(bào)錯(cuò)
let a;
typeof a; // 報(bào)錯(cuò)
let a; //如果使用的是var牌芋,上一行代碼會(huì)返回undefined
不允許重復(fù)聲明
let不允許在相同作用域內(nèi)拉一,重復(fù)聲明同一個(gè)變量囤攀。
// 報(bào)錯(cuò)
function () {
let a = 10;
var a = 1;
}
// 報(bào)錯(cuò)
function () {
let a = 10;
let a = 1;
}
2背稼、塊級(jí)作用域
ES6 的塊級(jí)作用域
let實(shí)際上為JavaScript新增了塊級(jí)作用域
function fun() {
let a = 5;
if (true) {
let a = 10;
}
console.log(a); // 5
}
塊級(jí)作用域的出現(xiàn)桨嫁,讓立即執(zhí)行行數(shù)表達(dá)式可以簡(jiǎn)化:
(function () {
var a = ...;
...
}());
//簡(jiǎn)化為:
{
let a = ...;
...
}
塊級(jí)作用域與函數(shù)聲明
在塊級(jí)作用域內(nèi)植兰,應(yīng)盡量避免聲明函數(shù),若必須聲明璃吧,則應(yīng)該寫(xiě)成行數(shù)表達(dá)式楣导,而不是函數(shù)聲明,因?yàn)楹瘮?shù)聲明會(huì)被提升到塊級(jí)作用域的頭部畜挨。
(function () {
if (false) {
function f() { console.log('I am inside!'); }
}
f();
}());
//因?yàn)楹瘮?shù)聲明提升筒繁,上述代碼在ES6中實(shí)際相當(dāng)于:
(function () {
var f = undefined;
if (false) {
function f() { console.log('I am inside!'); }
}
f();//此時(shí)f不是一個(gè)函數(shù)彬坏,會(huì)報(bào)錯(cuò)。
}());
3膝晾、const命令
基本用法
const命令聲明的是一個(gè)常量栓始,一旦聲明,就不允許改變血当。
所以聲明時(shí)必須初始化幻赚,只聲明不賦值的const命令會(huì)報(bào)錯(cuò)。
const聲明與let相似:
- 不提升變量臊旭。
- 存在暫時(shí)性死區(qū)落恼。
- 只在聲明后使用。
- 只在塊級(jí)作用域內(nèi)有效离熏。
- 不可重復(fù)聲明佳谦。
const命令聲明對(duì)象時(shí),此對(duì)象的屬性的值依然可改變滋戳,對(duì)象本身不可改為新對(duì)象钻蔑,聲明數(shù)組時(shí)同理。
const obj= {};
// 為 obj 添加一個(gè)屬性奸鸯,可以成功
obj.pro = 123;
obj.pro // 123
// 將 obj 指向另一個(gè)對(duì)象咪笑,就會(huì)報(bào)錯(cuò)
obj= {};
const a = [];
a.push('Hello'); // 可執(zhí)行
a.length = 0; // 可執(zhí)行
a = ['world']; // 報(bào)錯(cuò)
4、頂層對(duì)象的屬性
瀏覽器環(huán)境下頂層對(duì)象是指window對(duì)象娄涩。
var窗怒、function聲明的全局變量是window對(duì)象的屬性,let蓄拣、const扬虚、class聲明的變量則不是。