hackftz

bits change world

导航

深入理解TypeScript——文档篇之变量声明

Posted on 2020-09-29 16:56  hackftz  阅读(135)  评论(0编辑  收藏  举报

一、var声明

    使用var的好处:公用变量,作用域下都可以获取到值。

    使用var的弊端:

  1. var声明可以在包含它的函数,模块,命名空间或全局作用域内部任何位置被访问,也就是说,var可以在其赋值前被访问(undefined),即使其定义在代码块内。

    function f(shouldInitialize: boolean) {
        if (shouldInitialize) {
            var x = 10;
        }
    
        return x;
    }
    
    f(true);  // returns '10'
    f(false); // returns 'undefined'
    
  2. var定义的变量可以重复定义,并且不会报错,所以会导致变量引用重叠。

    function sumMatrix(matrix: number[][]) {
        var sum = 0;
        for (var i = 0; i < matrix.length; i++) {
            var currentRow = matrix[i];
            for (var i = 0; i < currentRow.length; i++) {
                sum += currentRow[i];
            }
        }
    
        return sum;
    }
    
  3. 如果var定义的变量在for循环外部,并且for循环中为异步的输出,则会先执行同步循环,最后再走异步回调,那这样的话获取到的值就会是变量的最终值。

    for (var i = 0; i < 10; i++) {
        setTimeout(function() { console.log(i); }, 100 * i);
    }
    

        一个通常的解决方法是使用立即执行的函数表达式(IIFE)来捕获每次迭代时i的值:

    for (var i = 0; i < 10; i++) {
        // capture the current state of 'i'
        // by invoking a function with its current value
        (function(i) {
            setTimeout(function() { console.log(i); }, 100 * i);
        })(i);
    }
    

二、let声明

  1. 块作用域变量在包含它们的块或for循环之外是不能访问的。
  2. 不能在被声明之前读或写,直到声明它的代码之前的区域都属于 暂时性死区
  3. 不能在1个作用域里多次声明。
  4. 在一个嵌套作用域里,内层let定义的变量,会屏蔽外层let定义的变量。

三、const声明

  1. 给变量赋值后不能再改变(基本类型对应的是值,复杂类型对应的是引用)。
  2. 不能重新赋值。
  3. 可将对象内部属性设置为只读。

四、解构

    解构表达式要尽量保持小而简单。