zoukankan      html  css  js  c++  java
  • 使用VS Code开发TypeScript--定义变量推荐使用let

    使用VS Code开发TypeScript--定义变量推荐使用let

    目录

    作用域规则

    一直以来我们都是通过var关键字定义JavaScript变量。

    var a = 10;
    

    大家都能理解,这里定义了一个名为a值为10的变量。

    我们也可以在函数内部定义变量:

    function f() {
        var message = "Hello, world!";
    
        return message;
    }
    

    并且我们也可以在其它函数内部访问相同的变量。

    function f() {
        var a = 10;
        return function g() {
            var b = a + 1;
            return b;
        }
    }
    
    var g = f();
    g(); // returns 11;
    

    上面的例子里,g可以获取到f函数里定义的a变量。 每当g被调用时,它都可以访问到f里的a变量。 即使当g在f已经执行完后才被调用,它仍然可以访问及修改a。

    对于熟悉其它语言的人来说,var声明有些奇怪的作用域规则。 看下面的例子:

    function f(shouldInitialize: boolean) {
        if (shouldInitialize) {
            var x = 10;
        }
    
        return x;
    }
    
    f(true);  // returns '10'
    f(false); // returns 'undefined'
    

    有些读者可能要多看几遍这个例子。 变量x是定义在if语句里面,但是我们却可以在语句的外面访问它。 这是因为var声明可以在包含它的函数,模块,命名空间或全局作用域内部任何位置被访问,包含它的代码块对此没有什么影响。 有些人称此为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;
    }
    

    这里很容易看出一些问题,里层的for循环会覆盖变量i,因为所有i都引用相同的函数作用域内的变量。 有经验的开发者们很清楚,这些问题可能在代码审查时漏掉,引发无穷的麻烦。

    JavaScript的严格模式

    除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。
    "严格模式"体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。
    另一方面,同样的代码,在"严格模式"中,可能会有不一样的运行结果;一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行。掌握这些内容,有助于更细致深入地理解Javascript,让你变成一个更好的程序员。
    进入"严格模式"的标志,是下面这行语句:
      "use strict";
    老版本的浏览器会把它当作一行普通字符串,加以忽略。

    在TypeScript中,let、const语句需要严格模式,因此,在TypeScript(ts)文件的第一行应该是:

    "use strict";
    

    或者把文件tsconfig.json的"target"改为:

    "target": "es5"
    

    这样才能保证使用let语句正确。否者,出现:"Block-scoped declarations (let, const, function, class) not yet supported outside strict mode" 错误。

    let与var的区别

    在TypeScript中,定义变量要用关键字var或者let。let是一种新的var,let和var的区别就是let使js实现了它的块级作用域,即词法作用域或块作用域(注:let可以看成var,它定义的变量被限制在特定范围中才能使用,离开这个范围就自动销毁)。

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

    上面代码执行结果:

    10
    10
    10
    10
    10
    10
    10
    10
    10
    10
    

    改为let之后:

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

    执行结果:

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    

    这才是我们希望的结果,因此我们推荐在TypeScript中定义变量尽量使用let。

    参考资料

  • 相关阅读:
    Asp.net Treeview 客户端选中效果实现 (初级)
    MYSQL生成日历表,通常在做报表的时候需要用来生成一个临时表,用来左连接等。
    写了一个抽奖类,感觉还不错,可以适合各种变化
    将系统的内部类:HttpValueCollection 移到自己的系统中,使其能方便的解析id=1&name=张三&sex=男这样的字符串参数 querystring
    指定某个文件的创建 修改 访问时间
    Reqeust["keyname"] 的读取顺序
    pku1463 Strategic game
    pku1947 Rebuilding Roads
    pku1848 Tree
    pku1056 IMMEDIATE DECODABILITY
  • 原文地址:https://www.cnblogs.com/junxian_chen/p/5935420.html
Copyright © 2011-2022 走看看