var
通過var聲明的變量會(huì)有變量提升的特性
舉個(gè)例子:
if(a){
var value = 1
}
console.log(value)
當(dāng)a是true的時(shí)候溃槐,輸出結(jié)果是1科吭,當(dāng)a結(jié)果是false時(shí)脆粥,結(jié)果并不是報(bào)錯(cuò)变隔,而是undefined
因?yàn)樵趫?zhí)行代碼時(shí)蟹倾,var會(huì)使變量提升,相當(dāng)于:
var value;
if (a) {
value = 1;
}
console.log(value);
在for循環(huán)中:
for (var i = 0; i < 10; i++) {
...
}
console.log(i); // 10
循環(huán)結(jié)束后我們?nèi)匀豢梢栽L問i的值
為了加強(qiáng)對(duì)變量生命周期的控制肌厨,Es6 引入了塊級(jí)作用域。
塊級(jí)作用域
全局作用域和函數(shù)作用域
在es5中柑爸,只有全局作用域和函數(shù)作用域盒音,這樣往往會(huì)出現(xiàn)兩個(gè)問題:
1、如果在函數(shù)作用域的變量聲明和在全局作用域的變量聲明重復(fù)的話譬圣,則函數(shù)作用域的變量聲明會(huì)覆蓋全局作用域的變量聲明
eg:
var a = 1
function fn(){
console.log(a)
if(0){
var a = 3
}
}
fn()//undefined
2雄坪、循環(huán)中的變量泄露為全局變量:
eg:
for(var i = 0; i < 10; i++ ){
}
console.log(i)//10
塊級(jí)作用域
let命令新增了塊級(jí)作用域,外層作用域無法獲取到內(nèi)層作用域维哈,非常安全明了。即使外層和內(nèi)層都使用相同變量名就缆,也都互不干擾谒亦。
接下來我們?cè)敿?xì)看看es6引入的let和const形成塊級(jí)作用域的特點(diǎn)
let和const
let和const稱為塊級(jí)聲明份招,用于聲明在指定的作用域之外無法訪問的變量
特點(diǎn)
1.不會(huì)被提升
if(false){
let value = 1
}
console.log(value)//Uncaught ReferenceError: value is not defined
2.如果重復(fù)聲明會(huì)報(bào)錯(cuò)
var value = 1;
let value = 2;//Uncaught SyntaxError: Identifier 'value' has already been declared
3.不綁定全局作用域
在全局作用域中使用 var 聲明的時(shí)候狞甚,會(huì)創(chuàng)建一個(gè)新的全局變量作為全局對(duì)象的屬性
var value = 1;
console.log(window.value); // 1
而let和const不會(huì):
let value = 1;
console.log(window.value); // undefined
let和const的區(qū)別
使用const聲明的變量不能重新賦值了,如果使用let ,那就可以
eg:
for (let i = 0; i < 10; i++) {}//沒有問題
for (const i = 0; i < 10; i++) {}//Uncaught TypeError: Assignment to constant variable.
也就是說當(dāng)用const聲明一個(gè)變量時(shí)谐腰,稱之為binding(綁定)。如果要使用const循環(huán)十气,可以使用for-in或for-of
如果使用const綁定一個(gè)值,那么這個(gè)值不能改變砸西,但是如果綁定的值是一個(gè)對(duì)象,那么里面的值就可以改變
eg:
const a = {
b: 1
}
// 沒有問題的做法
a.b = 2;
a.c = 3;
// 報(bào)錯(cuò)情況
a = {}; // Uncaught TypeError: Assignment to constant variable.
暫時(shí)性死區(qū)
如果在塊級(jí)作用域使用let衅疙,那么這個(gè)變量聲明就不受外部的影響鸳慈,綁定在這個(gè)作用域內(nèi)。
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
在代碼塊中走芋,如果使用了let變量聲明,那么在這行代碼之前嗽上,該變量都是不可用的熄攘,稱為暫時(shí)性死區(qū)(temporal dead zone,簡稱 TDZ)挪圾。