Ala*_*zek 9 javascript variables class let ecmascript-6
我有一个关于JavaScript的问题.当我声明新变量并为其分配新的类实例时,如果抛出错误,则变量完全无法使用.
下面的代码应该抛出错误
class MyClass {
constructor (config) {
this.someProperty = config.someProperty || '';
}
}
let myClassInstance = new MyClass();
Run Code Online (Sandbox Code Playgroud)
如果我尝试为其分配内容,JavaScript将引发错误.
myClassInstance = '123'
未捕获的ReferenceError:未定义myClassInstance
然后我尝试定义变量
let myClassInstance = '123'
未捕获的SyntaxError:已声明标识符'myClassInstance'
变量也无法删除.我们可以用这个问题做些什么吗?我只是很好奇,当然我会处理将undefined作为配置传递给构造函数.
编辑:我也尝试使用var,然后我可以重用myClassInstance.我想知道为什么如果我使用let变量无法删除,声明或新值不能重新分配.
编辑2:我可以处理传递undefined或传递空对象.只是纯粹的好奇心在JS控制台中使用该变量会发生什么,如果您一次粘贴所有内容,代码将无法执行
JLR*_*she 18
在交互式控制台中运行代码会产生一种在典型代码执行中不会发生的人为情况.
首先,您所看到的并不是特定于类构造函数中抛出的错误.如果执行let
RHS抛出错误的任何语句,则可以观察到相同的行为:
let myVariable = "".boom();
Run Code Online (Sandbox Code Playgroud)
MDN上的文档讨论了"临时死区",其中变量声明为let
存在,但在let
语句成功执行之前被视为不存在.
从ES6规范:
变量是在实例化包含词法环境时创建的,但在评估变量的LexicalBinding之前可能无法以任何方式访问它们.
简单来说,变量已创建,但无法访问,因为尚未评估其"LexicalBinding".
使用控制台,您创建了一种情况:
let
语句未成功执行(因此ReferenceError
尝试访问其变量是一个).let
在同一范围内,您有两个s用于相同的变量名称(因此第二个创建语法错误).(nb简单地let
在同一范围内有两个s会导致代码在编译阶段失败,在第一个甚至有机会尝试执行之前如果你没有一次输入代码进入控制台).这种情况在普通代码中不会发生.
通常,您将无法继续在抛出错误的范围内运行语句,因此第一个项目符号是不可能的.控制台允许您这样做.
在普通情况下,这将是更加不可能的,因为在第一个语句甚至可能尝试运行之前,代码将在编译阶段失败let
.
这就是为什么你在这两种情况下都会收到错误的原因.