想了解完整的故事,请查看我的另一个问题。
基本上,我曾经问过,在以下代码中,使用命名函数作为套接字处理程序是否更有效:
var app = require('express').createServer()
var io = require('socket.io').listen(app);
app.listen(8080);
// Some unrelated stuff
io.sockets.on('connection', function (socket) {
socket.on('action1', function (data) {
// logic for action1
});
socket.on('action2', function (data) {
// logic for action2
});
socket.on('disconnect', function(){
// logic for disconnect
});
});
总的来说,答案是肯定的(请参见上面的链接以获取更多细节),但以下评论由ThiefMaster发布:
我不熟悉V8的内部结构,但它可能足够聪明,编译函数一次并每次重用它,只是附加了不同的作用域。
所以现在我的问题是:在通常情况下匿名函数会导致创建多个函数实例的情况下,V8是否足够聪明,可以编译一次匿名函数并在不同的作用域中重用它们?例如,在上面的代码中,我希望连接事件的处理程序只被创建一次,而对于每个连接,action1
、action2
和disconnect
的处理程序都要被创建。在另一个问题中,这是通过使用命名函数来解决的,但我更感兴趣的是在V8中是否必须这样做,或者它是否会进行一些优化。