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 回答