Typescript Handbook 精簡版之變量聲明

變量聲明

letconst 是JavaScript新出的兩個變量聲明的方式。前面說過letvar相似,可是它們的做用域是不同的。html

關於做用域,在ES6以前的Javascript中,函數體是惟一能可以建立新做用域的地方。那時候沒有let,用var聲明的變量,做用域要麼是全局,要麼是函數體,沒有塊級的做用域(塊做用域變量在包含它們的塊外部或for循環外部是不能被訪問的)。而新版的Javascript引入了let關鍵字,用以聲明一個塊級域的本地變量,這樣能避免一些問題。git

至於const,它的做用域和let同樣,可是是聲明建立一個只讀常量,這裏要注意一下,這並不意味着該常量指向的值不可變,而是該常量只能被賦值一次!github

舉個例子:typescript

// numLivesForCat的值不能再變了
const numLivesForCat = 9;
const kitty = {
    name: "Aurora",
    numLives: numLivesForCat,
}

// 錯誤,kitty指向的對象不能變
kitty = {
    name: "Danielle",
    numLives: numLivesForCat
};

// 沒問題,對象的屬性能夠變化
kitty.name = "Rory";
kitty.name = "Kitty";
kitty.name = "Cat";
kitty.numLives--;

另外,使用const定義常量時,必定要初始化。函數

Typescript做爲Javascript的超集,天然也是支持letconst的。翻譯

該用哪一個

const沒什麼好說的,你須要常量就用它,不須要就不用。可是letvar要比較一下。code

使用var聲明變量時,無論你聲明多少次,你獲得的只有一個變量,而使用let時,同一個變量名在同一做用域內聲明一次以上會報錯。htm

使用var時很容易出bug,好比:對象

function sumMatrix(matrix: number[][]) {
    var sum = 0;
    for (var i = 0; i < matrix.length; i++) {
        var currentRow = matrix[i];
        for (var i = 0; i < currentRow.length; i++) {
            sum += currentRow[i];
        }
    }

    return sum;
}

裏層for循環中的i會覆蓋外層的i,由於i引用的都是相同的函數做用域內的變量。ip

可是若是把var換成let,內層的for循環本身是一個塊級做用域,會屏蔽外部的做用域中的相同名字的變量,因此這兩個i會井水不犯河水。

另外,由於var是函數做用域,因此對於一個var聲明的變量,你能夠先使用再聲明:

bla = 2;
var bla;
// ...

// 能夠理解爲下面這樣:

var bla;
bla = 2;

引用一段mozilla文檔中的話:

因爲變量聲明(以及其餘聲明)老是在任意代碼執行以前處理的,因此在代碼中的任意位置聲明變量老是等效於在代碼開頭聲明。這意味着變量能夠在聲明以前使用,這個行爲叫作「hoisting」。

嗯,使用var時,這叫變量聲明提高,可是若是你使用let時也這樣作,這叫錯誤! 塊級做用域的變量的一個特色是,它們不能在被聲明以前使用

最後,建議儘可能用let替換var

本文參考:

相關文章
相關標籤/搜索