2012-04-15 8 views
9

Để 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, action2disconnect 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.

+0

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 đó.) –

Trả lời

6

Có. I asked a very similar question (liên quan trong trường hợp của tôi để tạo các chức năng từ bên trong một hàm xây dựng) trên danh sách gửi thư V8. Tôi nhận được câu trả lời rằng mã của hàm là "... thường được sử dụng lại ...", mặc dù có một hàm riêng biệt đối tượng mỗi lần (theo yêu cầu của thông số kỹ thuật).


Lưu ý, tuy nhiên, câu hỏi của bạn không liên quan gì đến chức năng được đặt tên hoặc ẩn danh. Các chức năng trong ví dụ của bạn có thể có một cái tên:

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 
    }); 
}); 

Đó sử dụng một tên chức năng biểu hiện, đó là hoàn toàn hợp lệ và xử lý một cách chính xác bởi động cơ V8. (Đáng buồn thay, đó là not handled correctly by IE8 and earlier, tạo ra hai chức năng hoàn toàn khác nhau ở những thời điểm hoàn toàn khác nhau. Nhưng khi bạn đang sử dụng V8, bạn không phải lo lắng về điều đó.)