2

JavaScriptが変数のスコープに関数をどのように使用するかを考えて、次の例の場合に何が起こるかについて考え始めました。

var OuterClass = function () {

    var InnerClass = function () {
        this.foo = "bar";
    };

    this.getInstanceOfInner = function () {
        return new InnerClass();
    };

};

var instanceOfOuter = new OuterClass();
console.log(instanceOfOuter.getInstanceOfInner());

上記のフィドル

上記のコードをさまざまなブラウザでテストすると、結果は異なります。

  • Chrome:内部クラスのインスタンスをログに記録し、クラス宣言を認識しているようです。
  • Firefox:「型指定されていない」オブジェクトをログに記録しているようですが、プロパティは正しいです。
  • IE9:オブジェクトの文字列表現をログに記録します[object Object]

私はこれについて少し混乱しました、ここでの取引は何ですか?他の変数と同じように、クラス宣言はスコープの対象になりますか?それとも、各ベンダーが好きなように実装するのですか?

4

1 に答える 1

3

JavaScriptにはクラスとインスタンスはなく、プロトタイプとコンストラクター関数だけがあります(違いについてはこちらをご覧ください)。これらは、他のオブジェクトと同じスコープ規則に従います。したがって、コンストラクター関数InnerClass自体は外部では使用できませんÒuterClassが、返された「インスタンス」はそのプロトタイプを認識しており、ブラウザーはそれをログに記録する場合としない場合があります。

于 2013-02-03T19:54:05.353 に答える