Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript类声明范围混淆_Javascript_Scope - Fatal编程技术网

Javascript类声明范围混淆

Javascript类声明范围混淆,javascript,scope,Javascript,Scope,我在最新的chrome控制台中运行下面的代码 我以为Test类将在root的范围内声明,因此我可以通过字符串访问构造函数,但事实并非如此。有人能解释一下,我如何用'Test'创建一个新实例吗 (() => { let root = this class Test {} console.log( root['Test'] ) })() (()=>{ 让root=this; 类测试{} 这个。测试=测试; 日志(根['Test']) })()您可以将该类附加到此,因为默认情况下

我在最新的chrome控制台中运行下面的代码

我以为
Test
类将在
root
的范围内声明,因此我可以通过字符串访问构造函数,但事实并非如此。有人能解释一下,我如何用
'Test'
创建一个新实例吗

(() => {
  let root = this
  class Test {}
  console.log( root['Test'] )
})()
(()=>{
让root=this;
类测试{}
这个。测试=测试;
日志(根['Test'])

})()
您可以将该类附加到
,因为默认情况下未附加该类。 然后您将能够作为对象属性访问它

见下面的代码:

(()=>{
this.Test=类测试{
姓名(){
返回“Hi 5”;
}
}
console.log('Name is',newthis['Test']().Name())
console.log('或使用窗口')
console.log('Name is',新窗口['Test']().Name())

})()
类声明不会被挂起。您还应该阅读arrow创建的词法范围functions@Dummy出于好奇,他们被添加到了什么范围?它们需要一个作用域,对吗?
Test
将作用域限定为封闭的arrow函数,因为您使用了arrow函数,这称为词法作用域,但再次,因为您使用了arrow函数
let root=this
将引用没有
Test
作为成员的封闭实例。您能稍微解释一下您的答案吗?声明类测试不会将其绑定到当前上下文(此)。它只绑定到词法范围。如果要通过此访问它,则需要显式将其绑定到此。它与声明函数Test(){}完全相同。它不会绑定到“this”。除非您执行此.Test=Test或此.Test=function(){},否则如果类不在
窗口中,该类通常驻留在哪里?