Để xem toàn bộ câu chuyện, hãy xem my other question.Nội bộ V8 - Xử lý các chức năng ẩn danh
Về cơ bản, tôi đã yêu cầu nếu nó là hiệu quả hơn để sử dụng chức năng có tên trong xử lý ổ cắm cho đoạn mã sau:
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
});
});
Câu trả lời chung là có (xem liên kết trên để biết thêm chi tiết), nhưng những nhận xét sau đây được đăng bởi ThiefMaster:
tôi không quen thuộc với internals V8 nhưng nó có thể là đủ thông minh để biên dịch các chức năng một lần và tái sử dụng nó mọi lúc, chỉ với một phạm vi khác nhau kèm theo.
Vì vậy, bây giờ là câu hỏi của tôi. V8 có đủ thông minh để biên dịch các hàm ẩn danh một lần và tái sử dụng chúng với các phạm vi khác nhau trong các tình huống mà các hàm vô danh thường dẫn đến một số cá thể hàm được tạo ra không? Ví dụ, ở trên tôi mong đợi trình xử lý cho sự kiện connection
sẽ được tạo một lần nhưng các trình xử lý cho action1
, action2
và disconnect
sẽ được tạo cho mỗi kết nối. Trong câu hỏi khác, điều này đã được giải quyết với các chức năng được đặt tên nhưng tôi quan tâm hơn nếu điều này là cần thiết trong V8 hoặc nếu nó sẽ làm một số tối ưu hóa.
Lưu ý rằng điều này không liên quan gì đến chức năng được đặt tên hoặc ẩn danh; nó có liên quan đến việc bạn có tạo ra một hàm mới trên mỗi kết nối hay không. (Xem câu trả lời của tôi để biết thêm về điều đó.) –