ts的變量聲明有var,let和const,這尼瑪完全跟es6一樣嘛。就稍微介紹一下。
大多數js開發者對於var很熟悉了,原生js里沒有塊級作用域,只有函數作用域和全局作用域,還存在var的變量提升的問題,導致一些不熟悉js的開發者會發現一些怪異事件。點擊查看關於es6的let與const
let聲明
let聲明和var一樣的寫法,大家看前面的博客里面相信也看到了。
揀重要的說,let和var的區別就是let使js實現了它的塊級作用域,即詞法作用域或塊作用域。
而且它不存在變量提升。
function f(input: boolean) { let a = 100; if (input) { // Still okay to reference 'a' let b = a + 1; return b; } // Error: 'b' doesn't exist here return b; }
內部塊一樣能訪問外部塊,反之就不行了。這一特性使for循環的計數器就比較好用了,
for(let i = 0; i < arr.length; i++){} console.log(i) //ReferenceError: i is not defined
// 報錯 function () { let a = 10; var a = 1; } // 報錯 function () { let a = 10; let a = 1; }
let是不允許重復聲明的。
需要注意的是,現在的ts編譯器都是吧let直接編譯為var,所以let的特性在瀏覽器支持之前還是無法試用的。
在js里面輸出10個10的例子,在let下就不一樣了。
for (let i = 0; i < 10 ; i++) { setTimeout(function() {console.log(i); }, 100 * i); }
不僅是在循環里引入了一個新的變量環境,而是針對每次迭代都會創建這樣一個新作用域。 這就是我們在使用立即執行的函數表達式時做的事。
他會和我們預想的一樣輸出1-10。
const
const和let基本一致,只是const聲明的變量被賦值后不能再改變(所以對於const來說,只聲明不賦值,就會報錯),作用域同let。
const numLivesForCat = 9; const kitty = { name: "Aurora", numLives: numLivesForCat, } // Error kitty = { name: "Danielle", numLives: numLivesForCat }; // all "okay" kitty.name = "Rory"; kitty.name = "Kitty"; kitty.name = "Cat"; kitty.numLives--;
const a = []; a.push("Hello"); // 可執行 a.length = 0; // 可執行 a = ["Dave"]; // 報錯
這個數組和對象本身是可寫的,但是如果將另一個數組賦值給const變量,就會報錯。
使用的法則:
所有變量除了你計划去修改的都應該使用const