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