以前只用过JavaScript原生写网站特效,今天还是第一次听说typescript的,然后看了一下它的基本知识,感觉很像Java,真的太像了,但是又有不同点。很让我惊奇看到的第一个知识点就和以前不同,很新鲜。
变量的声明:
在typescript中我知道的变量的声明有两种(除了var),分别是let和const。以前我经常用的是var,let和var很相似,const和他们不一样,让我惊讶的是它居然能阻止对变量的再次赋值。
因为typescript是JavaScript的超集,所以JavaScript本身是支持let和const的。那么我们为什么要使用let和const而不是var呢?
var的作用域规则:
function v(a:boolean){
if(a){
var b=10;
}
ruturn b;
}
v(true);//10
v(false);//undefined
上面例子中变量b是if语句里面,但是我们却可以在外面访问它,是因为var申明可以包含它的函数,模块,命名空间或全局作用域任何位置被访问。这些作用域规则可能会引发错误,其中就有多次申明同一个变量并不会报错。var它不会管你声明了多少次,反正你只会得到一次。
let声明:
它和var写法是一样的;他们的区别不在语法上在语义上面;let不能再一个作用域里进行多次声明。
例如:
let x=5;
let x=10;//error
let块作用域:
当let声明一个变量的时候它使用的词法作用域或者是块作用域。块作用域指的就是他们包含的块以外的不能访问。
例如:
function fun(i:boolean){
let a=5;
if(i){
let b=a+5;
return b;
}
return b;//error:‘b‘ doesn`t exist here
}
或者
try{
throw "hello word!";
}
catch(e){
console.log("word!");
}
console.log("e");//error:‘e‘ doesn`t exist here
这里的b和e作用域就是if语句块或者catch语句块里。拥有块级作用域的变量有一个特点是他们不能再被声明之前读或者写。
两个块级作用域声明同一变量也会报错。
例如:
function fun(x){
let x=5;//error interferes with parameter declaration
}
function fu(){
let x=5;
var x=5;//error :can`t have both declarations of ‘x‘
}
并不是想说块级作用域变量不能在函数作用域内声明,而是块级作用域变量需要在不用块里声明。
const声明:
它还是let声明有相同的作用域规则,但是它被赋值后不能再被改变。除非使用特殊的方法去避免,实际上const变量的内部状态是可以改变的。
总结一下吧,现在有两种作用域相似的声明方式,哪一种更好呢?我觉得各有千秋吧,视情况而定。
书上说可以使用做小特权原则,所有变量出除了你计划去修改的都用const。使用const可以让我们更容易推测数据流动。但是我更喜欢用let。