TypeScript中let和var的區別介紹
1、作用域不同
用var聲明的變量,隻有函數作用域和全局作用域,沒有塊級作用域。而let可以實現塊級作用域,隻能在代碼塊{}內有效,在{}之外不能訪問,如下代碼所示:
{ let a = 0; var b = 1; } console.log(a) // ReferenceError: a is not defined console.log(b) // 1
2、let沒有變量提升
在代碼塊內,使用let命令聲明變量之前,該變量都是不可用的。這在語法上,稱為:暫時性死區,英文為:temporal dead zone,簡稱 TDZ。
//報錯 console.log(a) let a=10
3、let變量不能重復聲明
使用var,多次聲明同一個變量,不會報錯,隻會得到一個變量。
var a=1; var a=2;
上述例子中,所有的a的聲明實際上都引用瞭一個相同的a。在多人開發一個項目時,容易出現問題。比如都定義瞭一個變量a,但各自用途不同,後面定義的a會把前面定義的覆蓋掉。
而let就相對嚴格,無法多次聲明同一個變量,一個變量隻能聲明一次,並且無法在 let 語句前去訪問該變量
let a=1; let a=2; //錯誤
4、for循環中的let與var
for (var i = 0; i < 3; i++) { setTimeout(function (){console.log("i:" + i);}); }
上述代碼打印出來i都是3,這個結果令人感覺奇怪。其實並不奇怪,原因如下所示:
(1)var是全局變量,並且可以允許重復定義,所以在for (var i = 0; i < 3; i++)語句中,i重復定義瞭3次,最終的值以最後一次定義為準。
(2)javascript是單線程,setTimeout()會等for執行完之後才開始計時,此時i的值為3,最終打印出3
for (let j = 0; j < 3; j++) { setTimeout(function (){console.log("j:" + j);}); }
上述代碼打印出來i是0、1、2,原因分析如下:
(1)變量j是用let聲明的,當前的j隻在本輪循環中有效,每次循環的j其實都是一個新的變量。
(2)在for循環中,不僅循環體{}會生成塊級作用域,循環條件()也會生成塊級作用域,循環條件()的塊級作用域是循環體{}塊級作用域的父級作用域,所以let可以跨越()和{}作用域。
參考:TypeScript let與var的區別
到此這篇關於TypeScript let與var的區別的文章就介紹到這瞭,更多相關TypeScript let與var區別內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 基於JavaScript ES新特性let與const關鍵字
- JavaScript三大變量聲明詳析
- 簡單談談JavaScript變量提升
- JavaScript中var與let的區別
- 淺談JavaScript宏任務和微任務執行順序