MST
星途 面试题库

面试题:TypeScript变量作用域规则及常见问题

请阐述TypeScript中块级作用域、函数作用域的特点,并且说明在TypeScript中使用`var`、`let`和`const`声明变量时作用域的区别。如果在一个函数内部使用`let`声明了一个变量,在该函数内部的子函数中能否访问到这个变量?请举例说明。
45.1万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

块级作用域特点

  1. 定义:块级作用域由一对花括号 {} 界定,比如 if 语句块、for 循环块、while 循环块等内部都形成块级作用域。
  2. 特性:在块级作用域内声明的变量,其作用域仅在该块级作用域内部,外部无法访问。这有效避免了变量泄露到外部作用域导致命名冲突等问题。

函数作用域特点

  1. 定义:函数作用域是由函数声明所创建的作用域,函数内部声明的变量在整个函数内部都可访问。
  2. 特性:函数内部定义的变量,在函数外部不可见。函数参数也属于函数作用域,并且在函数内部可被访问和操作。同时,函数作用域存在变量提升现象,即变量声明会被提升到函数作用域顶部,但变量赋值不会被提升。

varletconst 声明变量时作用域的区别

  1. var:具有函数作用域,会发生变量提升。即在函数内部任何位置声明 var 变量,都相当于在函数顶部声明,例如:
function test() {
    console.log(a); // 输出: undefined
    var a = 10;
}
test();
  1. let:具有块级作用域,不存在变量提升。let 声明的变量必须在声明后才能使用,否则会报错,例如:
{
    console.log(b); // 报错: ReferenceError: b is not defined
    let b = 20;
}
  1. const:同样具有块级作用域,不存在变量提升。并且 const 声明的是常量,一旦声明必须立即初始化,且不能再次赋值,例如:
{
    const c = 30;
    c = 40; // 报错: Assignment to constant variable.
}

在函数内部使用 let 声明变量,子函数能否访问到该变量

在函数内部使用 let 声明的变量,在该函数内部的子函数中能访问到这个变量,因为子函数可以访问父函数的作用域,形成闭包。例如:

function outerFunction() {
    let outerVar = 'I am outer variable';
    function innerFunction() {
        console.log(outerVar); // 输出: I am outer variable
    }
    innerFunction();
}
outerFunction();