本文參考 網(wǎng)站
三種定義變量的方法分別是var、let茫负、const
1.var定義變量
語法及說明
var定義的變量可以修改蕉鸳,如果不初始化會(huì)輸出undefined,不會(huì)報(bào)錯(cuò)朽褪。
var a = 1;
// var a; 不會(huì)報(bào)錯(cuò)
console.log('函數(shù)外var定義a:' + a);//可以輸出a=1
function change(){
a = 4;
console.log('函數(shù)內(nèi)var定義a:' + a);//可以輸出a=4
}
change();
console.log('函數(shù)調(diào)用后var定義a為函數(shù)內(nèi)部修改值:' + a);//可以輸出a=4
特點(diǎn)
變量聲明提升
無論在代碼的任何位置聲明變量置吓,執(zhí)行引擎都會(huì)在任何代碼執(zhí)行之前處理。由于這個(gè)原因缔赠,所以在代碼中的任意位置聲明變量與在代碼開頭聲明變量是等效的
這意味著我們可以在定義變量之前使用衍锚,這個(gè)行為叫做'hoisting',也就是把所有的變量聲明移動(dòng)到函數(shù)或者全局代碼的開頭位置
聲明與未聲名變量的區(qū)別
未聲明的變量會(huì)被添加一個(gè)全局作用域嗤堰,而聲明變量作用域是當(dāng)前上下文
也就是說在函數(shù)內(nèi)部定義變量時(shí)如果不加var聲明這個(gè)變量是一個(gè)全局變量加上var時(shí)這個(gè)變量是一個(gè)局部變量
例:
function x() {
y = 1;
// 未添加聲明戴质,是全局變量(在嚴(yán)格模式下會(huì)拋出ReferenceError)
var z = 2;
}
x();
console.log(y); // '1'
console.log(z); // ReferenceError: z is not defined
2.let定義塊級(jí)變量
用于定義塊級(jí)變量語法結(jié)構(gòu)與var類似
如定義一個(gè)if塊級(jí)變量:
if (x > y) {
let gamma = 12.7 + y;
i = gamma * x;
}
let與var區(qū)別
let與var的區(qū)別主要體現(xiàn)在作用域上,當(dāng)在子代碼塊中使用中其聲明的是塊級(jí)變量踢匣,而var聲明的是全局變量:
var a = 5; //全局作用域
var b = 10;
if (a === 5) {
let a = 4; // if 塊級(jí)作用域
var b = 1; // 函數(shù)級(jí)作用域
console.log(a); // 4
console.log(b); // 1
}
console.log(a); // 5
console.log(b); // 1
在函數(shù)或程序頂層使用時(shí)告匠,let與var沒有什么區(qū)別
3. const定義常量
const用于聲明一個(gè)或多個(gè)常量,聲明時(shí)必須進(jìn)行初始化离唬,且初始化后值不可再修改
const b = 2;//正確
// const b;//錯(cuò)誤后专,必須初始化
console.log('函數(shù)外const定義b:' + b);//有輸出值
b = 5; //無法更改
console.log('函數(shù)外修改const定義b:' + b);//無法輸出
const定義常量與使用let定義變量十分相似:
1.二者都是塊級(jí)作用域
2.都不能和它所在作用域內(nèi)的其他變量或函數(shù)擁有相同的名稱
兩者還有以下兩點(diǎn)區(qū)別:
1.const聲明的常量必須初始化,而let聲明的變量不用
2.常量的值不能通過再賦值改變输莺,也不能再次聲明戚哎。而變量值可以修改