1. 程式人生 > 其它 >javascript變數宣告,關鍵字var、let、const詳解

javascript變數宣告,關鍵字var、let、const詳解

變數

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高階程式設計》

現代javascript教程