Javascript 是否为socket.IO中的每个套接字定义了新函数?

Javascript 是否为socket.IO中的每个套接字定义了新函数?,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,以下是Socket.IO网站上服务器代码的代码片段: io.sockets.on('connection', function(socket) { socket.emit('news', {hello:'world'}); socket.on('my other event', function(data) { console.log(data); }); }); 通过阅读此代码,我可以看出,在连接时,每个套接字都独立定义其事件。尽管如此,由于使用相同的

以下是Socket.IO网站上服务器代码的代码片段:

io.sockets.on('connection', function(socket) {
    socket.emit('news', {hello:'world'});
    socket.on('my other event', function(data) {
        console.log(data);
    });
});
通过阅读此代码,我可以看出,在连接时,每个套接字都独立定义其事件。尽管如此,由于使用相同的函数来定义这些事件,它们都是相同的。也就是说,每个套接字都有
“我的另一个事件”
,这做了相同的事情,但每个都是函数的新实例(浪费)

我的问题是:V8是否可以优化这种明显浪费的做法?比如说,使用相同的函数,但在不同的范围内。由于每个函数的作用域不同,我假设引用
socket
的任何函数都必须单独定义,从而有效地为每个连接克隆此事件

这里有没有我遗漏的优化,或者这只是一个非常糟糕的做法?这也适用于该实践的任何其他实例,而不仅仅是SIO;这只是最突出的例子


此外,如果表达得不好,我也会表示歉意,如有必要,我可以尝试澄清。

此函数可以重写为:

 io.sockets.on('connection', callback());

 function callback(socket) {
     socket.emit('news', {hello:'world'});
     socket.on('my other event', function(data) {
     console.log(data);
  }

我对V8的理解是,它监视代码中的行为并随着时间的推移进行优化,但这并不妨碍您在某些方面帮助它。通过编写这样的函数,您可以进行一些优化,以帮助V8继续运行。大多数V8优化问题都与对象隐藏类型有关,在本例中,是的,我认为V8没有看到函数,因为它是内联的,在代码运行之前,技术上可以是任何内容。如果您担心它,就不要用回调地狱风格编写代码。

JavaScript运行时的内部不是最公开的东西,但是可以安全地假设,因为代码是常量,所以需要为每个套接字事件处理程序创建的只是一个函数实例。所有实例都可以(人们可能会认为)使用代码的共享副本。@我希望是尖刻的,因为V8是开源的,这是这里有人知道的互联网上最大的编码问答网站。另外,我很想知道为什么在被问到这个问题后的7分钟内,这个问题的答案是-2。我想问一下,这个问题有什么错?这是一个问答网站,不是吗?是的,对不起,“公共”这个词不是最好的选择。我的意思是,这个主题非常神秘,真正(真正)熟悉它工作原理的人很少。在JavaScript中,编写代码的方式非常惯用,因此这是一个首要的优化问题。至于反对票,我无法解释;我没有投反对票。@Pointy不幸的是,这个数字很小,几乎没有地方可去,所以我认为so的规模将提供找到答案的最佳机会。我还希望,由于node保证使用V8(不依赖于编译器),所以会有一个具体的答案专门应用于它。不过,我想我得带着好奇心到前线去学C。感谢您比我在这里得到的一些回答更友好。您可以使用Node/V8的各种分析工具,创建一个模拟,让1,101001000等websocket客户端连接(或者模拟模式),而不是通过查看源代码(我解释为您的“learn C”注释)来推理并查看堆配置文件对对象创建和内存使用的说明。您可以找到一些关于V8优化的参考资料,特别是在中,有时甚至在上,但我没有找到很好的参考资料。