TypeScript 的变量声明

91 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

前言

let 和 const 是 JavaScript 里相对较新的变量声明方式。 像我们之前提到过的, let 在很多方面与 var 是相似的,但是可以帮助大家避免在 JavaScript 里常见一些问题。

var和let都用于声明变量,不同的是:

let 声明的变量不能重复声明。

var 声明

一直以来我们都是通过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。

function f() {
    var a = 1;

    a = 2;
    var b = g();
    a = 3;

    return b;

    function g() {
        return a;
    }
}

f(); // returns 2

let 声明

现在你已经知道了var存在一些问题,这恰好说明了为什么用let语句来声明变量。 除了名字不同外, let与var的写法一致。

let hello = "Hello!";

主要的区别不在语法上,而是语义,我们接下来会深入研究。

块作用域

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

function f(input: boolean) {
    let a = 100;

    if (input) {
        // Still okay to reference 'a'
        let b = a + 1;
        return b;
    }

    // Error: 'b' doesn't exist here
    return b;
}

这里我们定义了2个变量a和b。 a的作用域是f函数体内,而b的作用域是if语句块里。

总结

var是函数作用域,let 是块状作用域: 在函数里使用 var 声明了一个变量,那么这个变量在整个函数内都是有效的,例如在上述代码中 for 循环里用var声明一个变量,在 for 循环外也是可以使用的。但是let作用域是块状作用域,只在作用域里有效,例如在 for 循环里用let声明一个变量,在 for 循环外面是不能被访问的。

使用 let 声明的变量不属于顶层对象 顶层对象,在浏览器中指的是 window,在 node 环境中指的是 global 对象。 var 声明的变量属于顶层对象 window,因此可以通过 window. 变量名 来访问这些变量,而 let 和 const 声明的变量不能这样访问。