1

次のコードスニペットでは、「this.x()」はケース2でのみ呼び出すことができます(main()を参照)。また、Barはケース1ではこれと等しくありませんが、ケース2では等しくなります。

function Class_Bar() {
    this.panel = null;
    this.init = function () {
        // do some stuff
        this.panel = 20;
    }
    this.apply = function () {
        alert(Bar == this);
        Bar.x();
        this.x();
    }
    this.x = function() {
        alert("Some friendly message");
        alert(Bar.panel);
    }
}

var Bar = new Class_Bar();

function Class_Factory() {
    this.factories = new Array();
    this.add = function (init, apply) {
        this.factories.push({"init":init, "apply":apply});
    }
    this.init = function () {
        for (var i = 0; i < this.factories.length; ++i) {
            this.factories[i]["init"]();
        }
    }
    this.apply = function () {
        for (var i = 0; i < this.factories.length; ++i) {
            this.factories[i]["apply"]();
        }
    }
}

var Factory = new Class_Factory();

function main() {
    // Case 1
    Factory.add(Bar.init, Bar.apply);

    Factory.init();
    Factory.apply();

    // Case 2
    Bar.init();
    Bar.apply();
}

main();

http://pastebin.com/fpjPNphx

この動作を「修正」/回避する方法はありますか?

考えられる解決策を見つけましたが、それは「悪い」ハックのようです。:Javascript:イベントコールバック関数からオブジェクトメンバーにアクセスする方法

4

1 に答える 1

1

を渡すことBar.initで、実際には関数を渡すだけであり、それが属する情報Bar(つまり、this値がどうあるべきか) は渡されません。あなたができることは、その情報をバインドすることです:

Factory.add(Bar.init.bind(Bar), Bar.apply.bind(Bar));
于 2012-09-03T20:00:43.663 に答える