关于TypeScript中let变量跨块重分配未报错的技术问询
关于let变量块级作用域的常见误解
嘿,这个问题其实是对块级作用域规则的一个常见误解,我来给你掰扯清楚~
首先得明确:let的块级作用域不是说变量只能在声明它的那一段非嵌套代码里用,而是它的作用域覆盖了声明它的整个块,以及所有嵌套在这个块里的子块。子作用域是可以访问并修改父作用域里的let变量的,这是JavaScript/TypeScript作用域的基本规则——内部作用域能向上查找外部作用域的变量。
举个你可能看到的类似代码例子:
// 父块级作用域 { let newSquare = { sideLength: 5 }; // 这里是嵌套的子块级作用域 if (true) { // 完全合法:子块能访问父块的newSquare变量,并且修改它的属性 newSquare.sideLength = 10; console.log(newSquare); // 输出 { sideLength: 10 } } console.log(newSquare); // 输出 { sideLength: 10 } }
那什么时候才会报错呢?只有当你在newSquare所在的父块之外去访问它的时候,才会触发“变量未定义”的错误,比如:
{ let newSquare = { sideLength: 5 }; } // 这里会报错:newSquare is not defined newSquare.sideLength = 10;
总结一下:你觉得“新块级作用域”应该看不到newSquare,但实际上那个新块是嵌套在newSquare所在的父块里面的,属于newSquare作用域的覆盖范围,所以修改完全合法~
内容的提问来源于stack exchange,提问作者DJC
相关产品推荐
相关产品推荐

