2

以下の caller.receiver メソッドに有効なthis参照があることを確認しようとしています。

これは単純化された例ですが、次のような関数の割り当てがあります。

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 に答える