因为Typescript是JavaScript的超集,所以说Ts是可以应用Js里面定义变量的var const let三种方法<br /> **var 声明** <br /> 现在为止var 已经被let const有所替代,因为var定义变量十分怪异。(可以在外面定义变量,也可以在内部访问变量)
function f() {
var a = 10;
return function g() {
var b =a + 1;
return b;
}
var g = fn()
g() // returns 11
作用域规则
var 声明可以在包含它的函数,模块,命名空间或全局作用域内部任意位置被访问
捕获变量怪异之处
for (var 1 = 0;i<10 ;i++) {
setTimeout(()=>{console.log(i)},100 * i)
// setTimeout 声明一下,setTimeout会在若干毫秒的延时后执行一个函数(等待其他代码执行完成)
// 与宏任务和微任务有关
}
会出现奇怪的形式。参数i会覆盖for循环里的i(所以不用怎么改for循环体里的代码)<br />**let 声明**<br /> var声明变量存在一些问题,所以出了let 语句 let 与 var的写法一致(语义是不同的)<br />块作用域<br /> 当用let 声明一个变量,它使用的是词法作用域或块作用域,var声明变量可以在包含它们的函数外访问,块作用域变量在包含它们的块或for循环之外是不能访问的。
function f(input:boolean) {
let a = 100
if(input) {
let b = a + 1
return b
}
// let 是块作用域,外面不能访问函数内部的变量
return b
}
// 这里我们定义了 2个变量 a 和 b。a的作用域是f函数体内,而b的作用域是if语句块里
注意一点:
function foo () {
return a
}
// 不能在'a'被声明前调用'foo'
// 运行时应该抛出错误
foo ()
let a
重定义及屏蔽
var 不会在乎声明几次;得到的1个
let 不能重复定义(比较严谨)
在一个嵌套作用域里引入一个新名字叫屏蔽。他可能会不小心引入一个新问题,也可以解决一些问题。
function sumMatrix(matrix:number[][]) {
let sum = 0
for (let i = 0 ; i < martrix.length; i++) {
var currentRow = martrix[i]
for (let i = 0 ; i < currentRow.length; i++) {
sum += currentRow[i]
}
}
return sum
}
// 这个循环能得到正确的结果,因为内层屏蔽环的i可以屏蔽掉外层循环的i
const 声明
与let 相似,它们被赋值后不能再改变,拥有let相同的作用域规则,不能重新赋值。