V8的内部 - 匿名函数的处理(V8 Internals - Handling of Anonymo

2019-06-23 15:13发布

对于完整的故事,看看我的其他问题 。

基本上,我问,如果它是更有效地在插座的处理程序下面的代码使用命名的功能:

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是足够聪明的编译匿名函数一次,并正在创建与情况下匿名函数通常导致一些功能情况不同范围内重复使用它们? 例如,上面我所期望的处理程序connection创建一次事件,但对于处理action1action2 ,并disconnect每个连接创建。 在其他问题该解决了与命名功能,但我更感兴趣,如果这是必要的V8或是否会做一些优化。

Answer 1:

是。 我问了一个非常类似的问题的V8邮件列表(在我的情况与从构造函数中创建函数)。 我得到的回答是该函数的代码是“......常重复使用......”,即使有每个(所要求的规格)时一个单独的函数对象


但是请注意,你的问题无关,与功能是否命名或匿名。 在您的例子中,函数可以有一个名字:

io.sockets.on('connection', function handleConnection(socket) {
    socket.on('action1', function (data) {
        // logic for action1
    });

    socket.on('action2', function (data) {
        // logic for action2
    });

    socket.on('disconnect', function(){
        // logic for disconnect
    });
});

使用命名函数表达式 ,这是完全合法和V8正确处理。 (可悲的是,它没有正确地处理IE8和更早版本 ,它在完全不同的时间创建两个完全不同的功能。但是当你正在使用V8,你不必担心。)



文章来源: V8 Internals - Handling of Anonymous Functions
标签: javascript v8