1. 因为TypescriptJavaScript的超集,所以说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相同的作用域规则,不能重新赋值。