var
語(yǔ)法及說(shuō)明
var關(guān)鍵字用于聲明一個(gè)或多個(gè)變量,聲明多個(gè)變量時(shí)使用逗號(hào)(,)分隔喉镰,聲明變量的同時(shí)可以對(duì)其初始化。
var name1 = value , name2 = value2 , ......
使用var聲明變量時(shí)惭笑,聲明的變量作用域是在當(dāng)前位置的上下文中侣姆。
例如:
var a = 1;
function x(){
a = 2;
console.log(a);
}
x();
則輸出為2,因?yàn)槿钟行С霖钥梢孕薷钠渲怠?br> 但是如果只是將其聲明并未賦值捺宗,則不會(huì)報(bào)錯(cuò),其值為undefined川蒙。
var a;
function x(){
console.log(a);//輸出為undefined
}
x();
特點(diǎn)
- 變量聲明提升
無(wú)論在代碼的任何位置聲明變量蚜厉,執(zhí)行引擎都會(huì)在任何代碼執(zhí)行之前處理。由于這個(gè)原因畜眨,所以在代碼中的任意位置聲明變量與在代碼開(kāi)頭聲明變量是等效的昼牛。
例如:
function x(){
a = 1;
var a;
console.log(a);//輸出為1
}
x();
注意:雖然可以先使用再定義變量,但是建議還是先定義再使用康聂,這樣可以使變量的作用域更加清晰匾嘱。
- 聲明與未聲名變量的區(qū)別
未聲明的變量會(huì)被添加一個(gè)全局作用域,而聲明變量作用域是當(dāng)前上下文:
function x() {
y = 1; // 在嚴(yán)格模式下會(huì)拋出ReferenceError
var z = 2;
}
x();
console.log(y); // '1'
console.log(z); // ReferenceError: z is not defined
聲明變量在任何代碼執(zhí)行前創(chuàng)建早抠,而未聲明的變量只有在執(zhí)行賦值操作的時(shí)候才會(huì)被創(chuàng)建:
console.log(a); // 拋出ReferenceError霎烙。
console.log('hello world'); // 不會(huì)執(zhí)行
聲明變量是不可配置屬性,而未聲明變量是可配置的:
var a = 1;
b = 2;
delete this.a; // 在嚴(yán)格模式下拋出TypeError,非嚴(yán)格模式下執(zhí)行失敗且無(wú)任何提示
delete this.b;
console.log(a, b); // 拋出ReferenceError悬垃,'b'屬性已經(jīng)被刪除
在嚴(yán)格模式下游昼,使用未賦值的變量會(huì)拋出異常,推薦還是先定義(聲明)再使用變量尝蠕。
let
語(yǔ)法及說(shuō)明
let用于定義塊級(jí)變量烘豌,其語(yǔ)法結(jié)構(gòu)類似于var:
let name1 = value , name2 = value2 , ......
特點(diǎn)
- var聲明的變量是函數(shù)級(jí)的或者是全局的,而let用于聲明塊級(jí)作用域看彼。
var a = 1;
if(a > 0){
let b = 2;
console.log(b);//輸出2
a --;
}
console.log(a);//輸出0
console.log(b);//“ReferenceError”
所以此時(shí)的b的作用域是if語(yǔ)句里面廊佩。
- let不允許在相同作用域內(nèi),重復(fù)聲明同一個(gè)變量靖榕。
function () {
let a = 1;
let a = 2;
}//error
- let不存在變量聲明提升
a = 1;
let a;
console.log(a);//error
const
語(yǔ)法及說(shuō)明
const用于聲明一個(gè)或多個(gè)常量标锄,聲明時(shí)必須進(jìn)行初始化,且初始化后值不可再修改:
const name1 = value1 , name2 = value2 , ......
特點(diǎn)
- const聲明常量茁计,一旦聲明料皇,常量的值就不能改變。
const PI = 3.14;
PI = 1;
console.log(PI);//error
- const一旦聲明就必須初始化
const a; //error
- const也是塊級(jí)作用域內(nèi)有效
var a = 1;
if(a > 0){
const b = 2;
console.log(b);//輸出2
a --;
}
console.log(a);//輸出0
console.log(b);//“ReferenceError”
- const也沒(méi)有變量聲明提升
console.log(a);//error
const a = 1;
何時(shí)使用var星压,let以及const
在ES6中基本已經(jīng)不建議用var了践剂,因?yàn)関ar定義的變量沒(méi)有塊級(jí)作用域,并且它存在變量聲明提升娜膘,在嚴(yán)格模式下可能會(huì)出現(xiàn)意想不到的錯(cuò)誤逊脯,我們現(xiàn)在推薦使用const,當(dāng)不能使用const的時(shí)候再用let竣贪。