另一种方法是Javascript调用方法

时间:2015-08-04 07:29:41

标签: javascript methods

现在我尝试用jslib实现Unity Webgl。我对如何在另一种方法的功能中调用方法感到困惑。我想在消息来临时调用方法Recv(ws.onmessage)。但是,它显示" TypeError:this.Recv未定义"。你能帮我弄清楚这个来源吗?
谢谢!!!!!

这是我的源代码

var ws = null;
var init_url = "";
var received_msg = "";
var error_msg = "";

var WebsocketLib = {
Hello: function(){
    window.alert("Hello,world!");
},
InitSocket: function(url){
    init_url = Pointer_stringify(url);
    console.log("InitWebSocket: "+init_url);
    ws = new WebSocket(init_url);
    ws.onopen = function(evt){ 
            console.log("Connect");
            isConnected = false;
            ws.send("hello");
        }; 
    ws.onclose = function(evt) { 
            console.log("Close");
            isConnected = false;
        }; 
    ws.onmessage = function(evt) {
            received_msg = evt.data;
            console.log("[recv] "+received_msg);
            this.Recv.call(this);
        }; 
    ws.onerror = function(evt) {
            error_msg = evt.data;
            console.log("[error] "+error_msg);
            this.Error.call(this);
        };
},
Recv: function(){
    console.log("[recv] "+received_msg);
    var buffer = _malloc(received_msg.length + 1);
    writeStringToMemory(returnStr, buffer);
    return buffer;
},
Error: function(){
    console.log("[error] "+error_msg);
    var buffer = _malloc(error_msg.length + 1);
    writeStringToMemory(error_msg, buffer);
    return buffer;
}
}

2 个答案:

答案 0 :(得分:2)

ws.onmessage this内部会引用ws(因为我们在ws的方法中),而不是WebsocketLib

但是,在你定义处理程序的Initsocket中,this会正确地(,就像你想要的那样)引用WebsocketLib对象,所以你可以创建一个绑定函数,用于绑定外部 this值,以便在事件处理程序中用作this,如下所示:

ws.onmessage = function(evt) {
        received_msg = evt.data;
        console.log("[recv] "+received_msg);
        this.Recv.call(this);
}.bind(this); 

答案 1 :(得分:2)

在JavaScript中,this的值与其他语言的行为不同。它的值取决于函数的调用方式。您可以在Mozilla MDN page

中详细了解相关信息

要解决您的具体问题,您可以:

InitSocket: function(url){
    var that = this;                                  // [1]
    init_url = Pointer_stringify(url);
    console.log("InitWebSocket: "+init_url);
    ws = new WebSocket(init_url);
    ws.onopen = function(evt){ 
            console.log("Connect");
            isConnected = false;
            ws.send("hello");
        }; 
    ws.onclose = function(evt) { 
            console.log("Close");
            isConnected = false;
        }; 
    ws.onmessage = function(evt) {
            received_msg = evt.data;
            console.log("[recv] "+received_msg);
            that.Recv.call(that);                     // [2]
        }; 
    ws.onerror = function(evt) {
            error_msg = evt.data;
            console.log("[error] "+error_msg);
            that.Error.call(that);                    // [2]
        };
},

在第1行中,我将this变量绑定到我决定调用that的自定义变量(但您可以根据需要调用它)。然后在第2行中,我使用了that而不是this

ws.onmessage函数中,this的值不是指WebsocketLib的实例,因此您需要使用此“技巧”并访问正确的this值使用闭包中保存的值,在that的值内。