Вопрос по javascript – V8 Internals - Обработка анонимных функций

10

Для полной истории, проверьтемой другой вопрос.

По сути, я спросил, было ли более эффективно использовать именованные функции в обработчиках сокетов для следующего кода:

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:

I'm not familiar with V8 internals but it might be smart enough to compile the function once and re-use it everytime, just with a different scope attached.

Так что теперь это мой вопрос. Достаточно ли уместен V8 для однократной компиляции анонимных функций и их повторного использования в различных областях в ситуациях, когда анонимные функции обычно приводят к созданию нескольких экземпляров функций? Например, выше я бы ожидал обработчик дляconnection событие, которое будет создано один раз, но обработчики дляaction1, action2, а такжеdisconnect быть создан для каждого соединения. В другом вопросе это было решено с помощью именованных функций, но меня больше интересует, нужно ли это в V8 или он будет выполнять некоторые оптимизации.

Обратите внимание, что это не имеет ничего общего с именованной или анонимной функцией; это связано с тем, создаете ли вы новую функцию для каждого соединения. (См. Мой ответ для получения дополнительной информации об этом.) T.J. Crowder

Ваш Ответ

1   ответ
7

задал очень похожий вопрос (в моем случае это связано с созданием функций из функции конструктора) в списке рассылки V8. Я получил ответ, что функция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
    });
});

Который используетnamed function expression, что совершенно правильно и правильно обрабатывается V8. (К сожалению, этоне обрабатывается в IE8 и более ранних версиях, которые создают две совершенно разные функции в совершенно разные времена. Но поскольку вы используете V8, вам не нужно об этом беспокоиться.)

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded"...I don't really know for sure what any other JS engine does, but I would be quite surprised if they duplicated code for distinct function objects created from the same site in the source text."Error: User Rate Limit Exceeded

Похожие вопросы