超出函数回调范围

时间:2013-08-19 06:38:22

标签: javascript node.js

我的客户“类”看起来像这样:

var Client = (function () {
    function Client(socket)
    {
        this.socket = socket;
        this.country_code = null;

        var that = this;

        this.socket.on('message', function(data) {
            var r = JSON.parse(data);

            switch (r.action) {
                case 'init':
                    that.country_code = r.country_code;

                    break;
            }
        });
    }

    Client.prototype.message_handler = function(data)
    {
    };

    return Client;
})();

我正在使用websocket.io模块接收来自客户端的消息。现在,上面的代码有效,但我真的想拥有Client.prototype.message_handler,所以ctor看起来像这样:

function Client(socket)
{
    this.socket = socket;
    this.country_code = null;

    this.socket.on('message', this.message_handler);
}

然而,问题是现在在message_handler函数中

Client.prototype.message_handler = function(data)
{
    var r = JSON.parse(data);

    switch (r.action) {
        case 'init':
            this.country_code = r.country_code; // Doesn't work.

            break;
    }
};

this无法解析为Client-class。无论如何通过thisthis.socket.on('message', this.message_handler)传递给函数?这样,我可以使用不同处理程序的继承。

1 个答案:

答案 0 :(得分:1)

使用here所述的Javascript Function.prototype.bind功能。在你的情况下,你可以这样做(更新感谢@ nhaa123的修复):

this.socket.on('message', this.message_handler.bind(this));

然后socket的消息处理程序将始终绑定到Client实例。