javascript變數宣告,關鍵字var、let、const詳解
阿新 • • 發佈:2021-07-05
變數
var關鍵字
- 定義變數,可以用var操作符,後跟變數名
var name;
var age = 18;//同時設定值
var message = 'hello',
male = false,
color = 'blue';//同時宣告多個變數,用逗號隔開
- var宣告作用域為函式作用域,或者全域性作用域,在函式作用域中,函式執行結束時,變數會被銷燬
function test(){
var name = 'lijunda';
}
text();
console.log(name);//出錯,變數已被銷燬
- var的變數提升特性,變數會自動在作用域頂部載入,也就是說在同一個作用域中,可以先呼叫,再宣告,let並沒有這個特性
function foo(){
console.log(name);
var name = 'lijunda';
}
foo()//輸出lijunda
let關鍵字
- let跟var一樣是宣告變數的關鍵字
- var可以重複宣告變數,而let不行
var name = 'lijunda';
var name = 'Richard';
let name = 'lijunda';
let name = 'Richard';//報錯
- let宣告的範圍是塊級作用域,var宣告的範圍是函式作用域。
if(true){ var name = 'lijunda'; console.log(name);//lijunda } console.log(name);//lijunda if(true){ let age = 25; console.log(age);//lijunda } console.log(age);//報錯,age未定義
- let沒有和var一樣的變數提升特性
- let在全域性作用域中宣告的變數不會成為window物件的屬性(var宣告的變數則會)
- for迴圈中的let宣告
for迴圈var定義的迭代變數會滲透到迴圈體外部:
for(var i=0; i<5; i++){
//迴圈邏輯
}
console.log(i);//5
let則不會
for(let i=0; i<5; i++){
//迴圈邏輯
}
console.log(i);//ReferenceError:i未定義
使用var的時候,還有一個奇怪的特性:
for(var i=0; i<5 ;i++){ setTimeout( ()=>console.log(i), 0 ) } //你以為可能會輸出0,1,2,3,4 //實際上會輸出5,5,5,5,5
之所以會這樣,是因為在推出迴圈時,迭代變數儲存的是導致迴圈退出的值:5。在後來執行超時邏輯時,所有的i都是同一個i。
使用let則不會
for(let i=0; i<5 ;i++){
setTimeout( ()=>console.log(i), 0 )
}
//輸出0,1,2,3,4
const關鍵字
- const用來宣告常量
const name = 'lijunda'//在宣告常量的時候就要賦值
- const宣告的常量不可被修改
- const不允許重複賦值
- const宣告的作用域也是塊級作用域
- const宣告的物件,可以修改這個物件的屬性
最佳實踐
- 不適用var
- const優先,let次之
參考資料:
《javascript高階程式設計》