Egret开放平台

TS中 var 和 let 的区别

2019-04-30  本文已影响0人  Hifun丶

      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

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

上一篇下一篇

猜你喜欢

热点阅读