zoukankan      html  css  js  c++  java
  • TypeScript基础学习 —— 变量声明

    var、let、const

      一、var

        1、声明

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

    var a = 10;
    

            我们可以在其他函数内部访问相同的变量

    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变量。 即使当gf已经执行完后才被调用,它仍然可以访问及修改a。

    function f() {
        var a = 1;
        a = 2;
        var b = g();
        a = 3;
        return b;
    
        function g() {
            return a;
        }
    }
    f(); // returns 2
    

        2、作用域规则

          对于熟悉其它语言的人来说,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都引用相同的函数作用域内的变量。 有经验的开发者们很清楚,这些问题可能在代码审查时漏掉,引发无穷的麻烦。

      

      二、let

          let

    let hello = "Hello!";
    

        1、块作用域

          let声明一个变量,它使用的是 词法作用域块作用域。不同于使用 var 声明的变量那样可以在包含它们的函数外访问,块作用域变量在包含它们的函数外访问,块作用域变量在包含它们的块或者for循环之外是不能访问的。

    a++; // illegal to use 'a' before it's declared;
    let a;
    

        2、重定义及屏蔽

          使用var声明时,它不在乎你声明多少次;你只会得到1个。

    function f(x) {
        var x;
        var x;
        if (true) {
            var x;
        }
    }
    

          let声明就不会这么宽松

    let x = 10;
    let x = 20; // 错误,不能在1个作用域里多次声明`x`
    
    function f(x) {
        let x = 100; // error: interferes with parameter declaration
    }
    
    function g() {
        let x = 100;
        var x = 100; // error: can't have both declarations of 'x'
    }
    

      三、const

        1、声明    

          它们与let声明相似,但是就像它的名字所表达的,它们被赋值后不能再改变。 换句话说,它们拥有与let相同的作用域规则,但是不能对它们重新赋值。

  • 相关阅读:
    接口测试总结
    在 github 上获取源码
    推荐一个css帮助手册的版本 同时提供chm和在线
    由csdn开源项目评选中闹出刷票问题想到投票程序的设计
    由一个园友因为上传漏洞导致网站被攻破而得到的教训
    让 SVN (TortoiseSVN)提交时忽略bin和obj目录
    未能进入中断模式,原因如下:源文件“XXXXXX”不属于正在调试的项目。
    未能加载文件或程序集“XXXXX”或它的某一个依赖项。试图加载格式不正确的程序。
    .Net AppDomain.CurrentDomain.AppendPrivatePath(@"Libs");
    C# Remoting的一个简单例子
  • 原文地址:https://www.cnblogs.com/Lyh1997/p/10907692.html
Copyright © 2011-2022 走看看