0

タイトルでやった以上に自分が何をしているのかを説明する方法が思いつかないので、繰り返します。オブジェクト内から呼び出された無名関数がそのオブジェクトのスコープにアクセスすることは可能ですか?次のコードブロックは、私ができるよりもうまくやろうとしていることを説明するはずです。

function myObj(testFunc) {
    this.testFunc = testFunc;


    this.Foo = function Foo(test) {
        this.test = test;

        this.saySomething = function(text) {
            alert(text);
        };
    };

    var Foo = this.Foo;

    this.testFunc.apply(this);
}

var test = new myObj(function() {
    var test = new Foo();
    test.saySomething("Hello world");
});

これを実行すると、「Fooが定義されていません」というエラーが表示されます。Foo匿名関数を呼び出すときにそれが定義されるようにするにはどうすればよいですか?これがさらなる実験のためのjsFiddleです。

編集var Foo = this.Foo;:インスタンスに渡す無名関数に行を追加すると、これが機能するという事実を認識していますmyObj。ただし、無名関数内で変数を公開する必要はありません。他にオプションはありますか?

4

3 に答える 3

5

する必要がありますthis.Foo

var test = new myObj(function() {
    var test = new this.Foo();
    test.saySomething("Hello world");
});

http://jsfiddle.net/grzUd/5/

または、代わりに:を使用しwithます

var test = new myObj(function() {
    with (this) {
        var test = new Foo();
        test.saySomething("Hello world");
    }
});

http://jsfiddle.net/grzUd/6/

于 2012-07-09T02:27:44.630 に答える
2

に変更var test = new Foo();var test = new this.Foo();ます。

編集:または、パラメータとして渡すこともできます。

function myObj(testFunc) {
    this.testFunc = testFunc;

    var Foo = function (test) {
        this.test = test;
        this.saySomething = function(text) {
            alert(text);
        };
    };

    this.testFunc(Foo);
}

var test = new myObj(function(Foo) {
    var test = new Foo();
    test.saySomething("Hello world");
});
于 2012-07-09T02:28:22.600 に答える
1

スコープチェーンの識別子の解決とプロパティの解決の違いについて混乱しているようです。

Fooは、myObjのインスタンスのプロパティです(つまり、オブジェクトプロパティです)。呼び出すと、 Fooがスコープチェーン上の変数として解決されます。これは、Fooを探すのに適切な場所ではありません。そのため、Petahの回答では、このオブジェクトのオブジェクトプロパティをスコープチェーンに配置するために、を使用しようとします。new Foo

于 2012-07-09T03:13:27.523 に答える