【问题标题】:How are variables and references stored in anonymous functions in javascript?javascript中的匿名函数中的变量和引用是如何存储的?
【发布时间】:2013-01-19 21:08:11
【问题描述】:

我正在使用 node.js(使用 socket.io)创建一个服务器,这个特定的问题一直困扰着我最长的时间。我为套接字连接制作了一个易于扩展的处理程序,以将每个不同的连接路由到不同的函数。

... <previous code> ...
var socketHandlers = {
                        'chat':chat.onMessage,
                        'chatNameRequest':chat.onNameRequest,
                        'changeRooms':commands.onPlayerRoomChange,
                        'commandEnter':commands.onCommandEnter
                    };

io.sockets.on('connection', function (socket) {
    console.log("New client connected.");

    // add all handlers to this socket when connected
    for (var handler in socketHandlers) {
        socket.on(handler, function(data) {
            console.log("Resolved handler for " + handler + ", called function " + socketHandlers[handler]);

            // sanitize each handler before sending it to the inner functions
            // leave more specific sanitization for the inner function
            data = valid.cleanData(data);
            socket = valid.cleanSocket(socket);

            // finally send it to the inner functions
            socketHandlers[handler](socket, data);
        });
    }
});

但是,它似乎不起作用。这是服务器的控制台输出:

   debug - flashsocket received data packet 5:::{"args":{"name":"Timothy"},"name":"chatNameRequest"}
Resolved handler for commandEnter, called function function (socket, data) {
<function contents, etc>

如您所见,程序收到“chatNameRequest”请求,但它错误地将其路由到“commandEnter”。有人能解释一下这里发生了什么吗?

【问题讨论】:

  • 检查其他问题,或在询问“事件处理程序 JavaScript 循环”时出现的任何问题 - 在同一基本问题上存在许多变化。
  • 您还必须处理您的处理程序函数似乎是对象上的“方法”这一事实。构建处理程序映射时,您可能需要将它们.bind() 发送到相关对象。

标签: javascript node.js socket.io anonymous-function


【解决方案1】:

看看你的console.log 输出什么。套接字接收到消息commandEnter,并将其路由到正确的处理程序。发布客户端代码?

另外,正如 Pointy 提到的,您应该查看 .bind (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind),因为您可能很快就会需要它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2014-11-05
    • 1970-01-01
    • 2011-03-14
    • 2018-05-11
    • 2010-12-19
    • 1970-01-01
    相关资源
    最近更新 更多