美文网首页Egret开放平台
TS中 var 和 let 的区别

TS中 var 和 let 的区别

作者: Hifun丶 | 来源:发表于2019-04-30 09:46 被阅读0次

          let 和 const 是 ES6 中新增的声明对象的类型。与 var 相比,let 和 const 不存在变量提升。变量提升,指的是在变量声明之前就可以使用,只是,在声明之前,变量的值为undefined。var 声明的变量,在全局范围内都有效,而 let 声明的变量,只在 let 所在的作用域内有效。如以下 for 循环:

    for(var i = 0; i < 10; i++) {

        console.log(i)

    }

    console.log(i); // 10

    在上述代码中,一般情况下,我们期望的是,报错,i is not defined。但是,由于在 for 循环内,i 是用 var 声明的,导致 i 在全局范围内都有效,所以输出 10. 要想避免这种情况,则应该使用 let ,使得 i 只在循环体内有效。

    let 还有一个特点,就是会将所声明的变量绑定与let所在的作用域,不受作用域外变量的影响。

    var a = 1;

    if (true) {

        a = 2; // 报错,a is not defined

        let a;

    }

    上述代码,在 if 语句内部对 a 赋值,会报错,即使已经在外部定义了 var a。所以,在一个作用域内,在 let 声明一个变量前,都不能操作该变量。这种现象在语法上称之为“暂时性死区”(temporal dead zone,简称TDZ)。

    现在再来看看我上篇文章提到的那个题目:

    function a() {

        return foo;

        var foo = 1;

    }

    function b() {

        return foo;

        let foo = 1;

    }

    console.log(a()); // undefined

    console.log(b()); // 报错 : foo is not defined

    第一个函数,在创建活动对象的时候,可以创建被 var 声明的 foo,只是此时返回的是 undefined。

    第二个函数,在创建活动对象的时候,不能收集被 let 声明的 foo,因为在 let 存在的作用域内,在 let 声明前,不能操作被 let 声明的对象。

    再来看一种情况:

    function a() {

      return foo;

      let foo = 1; // 报错 : Identifier 'foo' has already been declared

      function foo() { };

    }

    console.log(a());

    上述代码,在创建活动变量的时候,会报错。创建活动变量的细节在上一篇文章中。报错的原因是,不允许使用 let 重复声明变量。而使用 var 就不会有这种限制。

    function a() {

      var foo = 1;

      var foo = function () { };

      return foo;

    }

    console.log(a()); // function......

    ---------------------

    作者:人间大炮王

    来源:CSDN

    原文:https://blog.csdn.net/gebingsheng/article/details/81103341

    版权声明:本文为博主原创文章,转载请附上博文链接!

    相关文章

      网友评论

        本文标题:TS中 var 和 let 的区别

        本文链接:https://www.haomeiwen.com/subject/mzhmnqtx.html