2017-09-04 18 views
0

最新のクロムコンソールで以下のコードを実行します。Javascriptクラス宣言スコープの混乱

私はTestクラスがrootのスコープで宣言されると思ったので、文字列を介してコンストラクタにアクセスすることができましたが、これは当てはまりません。誰かが説明してください。'Test'で新しいインスタンスを作成するにはどうすればよいですか?

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

クラス宣言** **掲揚されません。また、矢印関数 – Dummy

+0

@Dummyによって作成されたレキシカルスコープについても読まなければなりません。好奇心の中から、どのスコープが追加されますか?スコープの権利が必要ですか? –

+0

'Test'は矢印関数を使用しているため、囲み矢印関数にスコープされますが、これは字句スコープと呼ばれますが、矢印関数' let root = this 'を使用したため、明らかにメンバーとしての「テスト」 – Dummy

答えて

1

それがデフォルトで付属しておりませんので、あなたはthisにクラスを添付することができます。 これでObjectプロパティとしてアクセスできます。

、以下を参照してくださいコード:

(() => { 
 
    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'に束縛されません。あなたはthis.Test = Testまたはthis.Test = function(){} –

関連する問題