2017-09-04 108 views
0

我在最新的chrome控制台中运行下面的代码。Javascript类声明范围混乱

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

(() => { 
    let root = this 
    class Test {} 
    console.log(root['Test']) 
})() 
+1

类的声明也没有** **得到悬挂。你还应该阅读由箭头函数 – Dummy

+0

@Dummy创建的词法范围出于好奇,他们添加的范围是什么?他们需要一个合适的范围? –

+0

'Test'将被限制在封闭的箭头函数中,因为您使用了箭头函数,这称为词法范围,但再一次,因为您使用了箭头函数'let root = this'将引用封闭的实例,而不是'Test'作为一个明显的成员 – Dummy

回答

1

您可以将类附加到this,因为它不是默认连接。 然后您将能够将其作为对象属性进行访问。

见下面的代码:

(() => { 
 
    this.Test = class Test { 
 
    name() { 
 
     return "Hi 5"; 
 
    } 
 
    } 
 
    console.log('Name is ', new this['Test']().name()) 
 
    console.log('Or using window ') 
 
    console.log('Name is ', new window['Test']().name()) 
 
})()

+0

如果不在'this'或'window'中,类通常驻留在哪里? –

+0

@AndrewRockwell检查此答案https://stackoverflow.com/a/37711826/5436486 – Tareq

0

(() => { 
 
    let root = this; 
 
    class Test {} 
 
    this.Test = Test; 
 
    console.log(root['Test']) 
 
})()

+1

你能解释一下你的答案吗? – yuriy636

+0

声明类测试不会将其绑定到当前上下文(this)。它只是绑定到词汇范围。如果你想让它通过它,你需要明确地将它绑定到这个。 –

+0

它与你声明函数Test(){}一样激动人心。它不会绑定到'this'。除非你这样做。Test = Test或this.Test = function(){} –