🔎 搜索词
globalThis重新定义的错误脚本属性不存在
🕗 版本与回归信息
- 这是我尝试的每个版本中的行为
⏯ Playground链接
https://www.typescriptlang.org/play/?noImplicitAny=false&ts=5.5.0-beta#code/DYUwLgBAlgdgbgQ2FAJgRggXggc2AewCMkAVACygGcA6WRZdAbgChRIBPLXA44cq2vCSo0LNhABeXPEVIUadYSgBMLIA
💻 代码
let invalid1 = globalThis.invalid1;
let y = globalThis.invalid1;
let z = globalThis.invalid2;
🙁 实际行为
Property 'invalid1' does not exist on type 'typeof globalThis'.
🙂 预期行为
它应该要么抱怨 invalid1
和 invalid2
,要么两者都不抱怨
关于问题的附加信息
这个问题只发生在脚本中,而不是模块中(如果我添加 export {}
,没有报告错误)。
5条答案
按热度按时间roejwanj1#
我认为您实际上应该在这里看到的是一个循环误差。
c7rzv4ha2#
let invalid1 = 1
没有定义globalThis.invalid1
,因此没有发生循环(仅在var
时才会出现这种情况)。请注意,上面的代码实际上具有有效的用例。我在执行
时发现了它。
2w3rbyxf3#
你好@nicolo-ribaudo。
在声明变量之前尝试使用变量将导致ReferenceError。这被称为“时间死区”,其中变量存在于作用域中,但无法访问。
然而,当你使用
var
声明一个变量时,变量声明会被提升(或“提升”)到当前作用域的顶部。这意味着,无论你在代码中在哪里声明该变量,JavaScript都将其视为如果你在作用域的开头声明它一样。然而,只有声明会被提升,而不是初始化。因此,如果你在初始化之前尝试访问该变量,它的值将是undefined
,但不会引起错误。另一方面,当你使用
let
声明一个变量时,声明也会被提升,但是JavaScript将这些变量放在从块开始到声明处理完毕的“时间死区”中。在这个“死区”期间,如果你尝试访问该变量,你将收到一个ReferenceError。所以,在你的情况下,当你尝试执行
let invalid1 = globalThis.invalid1;
而不定义globalThis.invalid1
时,invalid1
等于undefined
。这本身并不是问题,但是如果你在这一点之前的代码中尝试访问invalid1
,你将因为let
的“时间死区”而收到一个ReferenceError。然而,如果你使用
var
代替let
,就像在var invalid1 = globalThis.invalid1;
中那样,即使globalThis.invalid1
没有定义,invalid1
也只会是undefined
,不会引起错误,即使你在这一点之前访问了invalid1
,多亏了var
的提升。epggiuax4#
在上面的示例中,没有变量处于时间死区--您可以尝试运行该代码,它不会出错。
csga3l585#
FWIW,这个错误在这里报告,这是负责将
invalid1
成员放入符号表的mergeSymbols
调用。从某种意义上说,这是设计的一部分,因为代码在某种程度上对此是明确的。但也许这应该重新审视一下。