は、このコードによると:直接new Thing
持つかThing.create()
と、次のいずれかなぜこの場合、内部関数は外部変数にアクセスできませんか?
class Thing {
constructor() {
this.bar = (typeof foo !== "undefined"? foo : null); // (3)
}
static create() {
var foo = arguments[0];
return new Thing();
}
}
新しいThing
は、2つの方法で作成されることがあります。
2番目の方法で作成すると、新しい変数string
が宣言されます。理論的には、return
ステートメントまでのすべてのスコープ内に表示する必要がありますが、Thing.constructor()
(Thing.create()
と呼ばれます)ではstring
は表示されません。 Thing.prototype.bar
は常にnull
です。
なぜそうですか?ここ
それinner()
関数から見ある:
(function outer() {
var foo = 5;
(function inner() {
alert(foo);
})()
})();
理論
'使用strict'モードのjavascriptの外側には、[VARの巻き上げ](と呼ばれる範囲のルックアップを実行しますhttps://developer.mozilla。おそらくOPが混乱しているかもしれませんが、closureとhoistingについて読むと、 'var foo'がコンストラクタ内に存在しない理由を説明してくれることを願っています。 'create()' – kirinthos
あなたは完全に正しいと申し訳なく思っています。宣言せずに変数を使うことを考えていましたが、関数の変更については何も言わなかっただけです。これはコンストラクタでfooにアクセスできない理由を説明しています – kirinthos
第2の例では、 'create 'はおそらく' Thing'のプロトタイプではなく 'function Thing'自体にアタッチされるべきです。私はこれが、静的関数が最も機能すると思う方法だと思います。 – noppa