2

我试图确保我在下面的 caller.receiver 方法中有一个有效的这个引用。

这是一个简化的示例,但我有一些功能分配,例如:

service.fn = this.receiver

但是,当接收器函数执行时,我希望引用调用者,即我希望将字符串“Caller - Received”输出到控制台日志。

var service = {
    name: 'Service',
    fn: null,
    runFn: function () {
        this.fn(arguments);
    }
};

var caller = {
    name: 'Caller',
    receiver: function () {
        console.log(this.name + ' - Received');
    },
    perform: function () {
        service.fn = this.receiver;
        service.runFn();
    }
};

caller.perform();

任何帮助将不胜感激。

4

4 回答 4

2

将方法绑定到对象:

perform: function () {
    service.fn = this.receiver.bind(this);
    service.runFn();
}
于 2013-03-22T16:55:17.603 回答
1

您可以将 Recieve 引用传递给函数,然后使用 apply:http: //jsfiddle.net/d5tf2/

        var service = {
        name: 'Service',
        fn: null,
        runFn: function (ref) {
            this.fn.apply(ref,arguments);
        }
    };

    var caller = {
        name: 'Caller',
        receiver: function () {
            console.log(this.name + ' - Received');
        },
        perform: function () {
            service.fn = this.receiver;
            service.runFn(this);
        }
    };

    caller.perform();
于 2013-03-22T16:55:24.697 回答
1
var service = {
    name: 'Service',
    fn: null,
    runFn: function () {
        this.fn(arguments);
    }
};

var getCaller = function(){
    var that;
    return {
        name='Caller',
        receiver: function () {
            console.log(that.name + ' - Received');
        },
        perform: function () {
            that = this;
            service.fn = this.receiver;
            service.runFn();
        }
    }
};
var caller = getCaller();
caller.perform();

有趣的阅​​读:http: //jason.pettys.name/2011/10/06/javascript-this-and-that/

于 2013-03-22T16:55:46.097 回答
-1

把这个传进去

var service = {
    name: 'Service',
    fn: null,
    runFn: function (arguments) {
        this.fn(arguments);
    }
};

var caller = {
    name: 'Caller',
    receiver: function (that) {
        console.log(that.name + ' - Received');
    },
    perform: function () {
        service.fn = this.receiver;
        service.runFn(this);
    }
};

caller.perform();
于 2013-03-22T16:58:52.950 回答