【问题标题】:V8 Internals - Handling of Anonymous FunctionsV8 内部——匿名函数的处理
【发布时间】:2012-04-15 07:24:57
【问题描述】:

有关完整故事,请查看my other question

基本上,我问过在套接字处理程序中为以下代码使用命名函数是否更有效:

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 事件创建一次处理程序,但为每个连接创建action1action2disconnect 的处理程序。在另一个问题中,这是通过命名函数解决的,但我更感兴趣的是在 V8 中是否需要这样做,或者它是否会进行一些优化。

【问题讨论】:

  • 请注意,这与被命名或匿名的函数无关;它与您是否在每个连接上创建新功能有关。 (有关更多信息,请参阅我的答案。)

标签: javascript v8


【解决方案1】:

是的。我在 V8 邮件列表上asked a very similar question(在我的情况下与从构造函数中创建函数有关)。我得到的答复是该函数的 code 是“...通常重用...”,即使每次都有一个单独的函数 object(根据规范的要求) .


但请注意,您的问题与函数是命名还是匿名无关。您示例中的函数可能有一个名称:

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 正确处理。 (可悲的是,它是not handled correctly by IE8 and earlier,它在完全不同的时间创建了两个完全不同的函数。但是当你使用 V8 时,你不必担心这个。)

【讨论】:

  • 为什么函数命名或匿名无关紧要?很可能这无关紧要,但我们是否确定 V8 是否能始终如一地处理这两种功能?虽然超出了原始问题的范围,V8 也有可能具有一致的实现,但其他 JavaScript 运行时没有?
  • @anishpatel - 关于你的第一个问题,对我来说,它没有通过笑声测试来怀疑函数是否有名称会影响此优化。关于你的第二个问题,这个问题是专门关于 V8 的,但是在邮件列表中回答我的 V8 贡献者 Kevin Millikin 说 “......我真的不知道任何其他 JS 引擎做了什么,但是如果他们在源文本中复制从同一站点创建的不同函数对象的代码,我会感到非常惊讶。” 那是在 2011 年,当时其他引擎的优化程度远低于现在。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 2013-01-25
  • 2013-08-16
  • 1970-01-01
  • 2015-05-09
  • 2022-11-14
相关资源
最近更新 更多